微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果 std::vector::insert 由反向迭代器提供,它会做什么?

如何解决如果 std::vector::insert 由反向迭代器提供,它会做什么?

我正在按以下方式填充矢量并使其保持有序

vector<int>::iterator it = upper_bound(arr.begin(),arr.end(),value);
arr.insert(it,value);

现在我想保持相反的顺序。如果我这样做了怎么办

vector<int>::iterator it = upper_bound(arr.rbegin(),arr.rend(),value).base();
arr.insert(it,value);

arr.insert(it,value);

正常工作,即在 arr 中找到条目后放入新值?

什么是复杂性?在迭代开始时插入元素需要多长时间,即在向量的末尾?接近 O(1) 对吗?


我试过了

vector<int> src = {10,1,3,7,2,100};
    vector<int> dst;

    for (auto it=src.begin(); it!=src.end(); ++it) {
        //auto it2 = upper_bound(dst.begin(),dst.end(),*it);
        vector<int>::iterator it2 = upper_bound(dst.rbegin(),dst.rend(),*it).base();
        dst.insert(it2,*it);
    }

它奏效了,但为什么呢?如果 it2 是普通迭代器,那么,例如在 7搜索 {10,3 时,it2 将指向 10insert 将插入 { {1}} 在 7 之前。

之后如何显示


以下代码

10

印刷品

int main() {

    vector<int> src = {10,100};
    vector<int> dst;

    auto begin = src.begin();

    for (auto it=src.begin(); it!=src.end(); ++it) {
        cout << *it << endl;

        //auto it2 = upper_bound(dst.begin(),*it).base();
        if (it2 == begin) {
            cout << "begin" << endl;
        }
        dst.insert(it2,*it);
    }

    cout << dst << endl;

}

即它从不打印“开始”。但为什么?

解决方法

如果 it2 是普通迭代器,那么,例如在 {10,3,1} 中搜索 7 时,it2 将指向 10,insert 将在 10 之前插入 7。

除非反向迭代器取消引用旁边的值,否则它是 base(在基本类型的 pov 之后,在反向的 pov 之前)。您可以通过取消引用 it2(只要它位于 dst.end() 之前)来观察这一点,在这种情况下它指向 3。

这里有更多的中间输出,showing the difference

int main() {

    std::vector<int> src = {10,1,7,2,100};
    std::vector<int> dst;

    for (int i : src) {
        std::cout << i << " ";
        auto it = upper_bound(dst.rbegin(),dst.rend(),i);
        auto it2 = it.base();
        if (it != dst.rend()) {
            std::cout << *it << " ";
        } else {
            std::cout << "first ";
        }
        if (it2 != dst.end()) {
            std::cout << *it2;
        } else {
            std::cout << "last";
        }
        std::cout << std::endl;
        dst.insert(it2,i);
    }

    std::cout << dst << std::endl;

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。