使用迭代器为列表中的向量

时间:2017-08-14 03:51:51

标签: c++

我试图在列表中使用迭代器,如下所示,这是正确的方法吗?

我有两个向量v1和v2,我使用两个迭代器it1和it2。后来,我使用一个list<vector<int>::iterator>列表来推送迭代器it1和it2。这样可行,但如果任何一个向量为空,则会崩溃。

int main() {
vector<int> v1 ={1,2,3};
vector<int> v2 ={4,5,6,7};

vector<int>::iterator it1 = v1.begin();
vector<int>::iterator it2 = v2.begin();


list<vector<int>::iterator> l;
l.push_back(it1);
l.push_back(it2);

for(auto a : l){
    vector<int>::iterator it = a;
    while(*it){
        cout<<*it<<endl;
        it++;
    }
}
    return 0;
}

3 个答案:

答案 0 :(得分:2)

崩溃来自于尝试在it行中取消引用while(*it){。如果向量v为空,则迭代器v.begin()将不指向有效内存,并且取消引用它将导致分段错误。

答案 1 :(得分:0)

list<vector<int>::iterator> l;
l.push_back(it1);

如果假设v1为空,那么it1将是v1::end(),它是向量的最后一个元素之后的一个,并且不是向量的一部分。所以稍后当你做

while(*it){

你试图解除引用v::end()这就是崩溃的原因。为了避免这种情况,只有当迭代器没有指向l时才应该插入end

if(it1!= v1.end())
   l.push_back(it1);

答案 2 :(得分:0)

它会失败,因为在知道它的有效取消引用之前,你不能取消引用迭代器。如果向量为空begin == end并且结束不是解除引用的有效内容,因为它是容器末尾的一个。

您无法在不知道end的情况下迭代您的容器,并且您无法捕获它,您只能捕获begin。简单地解除引用迭代器以测试有效性是不正确的。它可以保留任何价值。

如何为每个向量捕获一对迭代器?

#include <vector>
#include <list>

#include <iostream>
#include <utility>
using namespace std;

int main() 
{
    const vector<int> v1 ={1,2,3};
    const vector<int> v2 ={4,5,6,7};

    list<pair<vector<int>::const_iterator, 
              vector<int>::const_iterator>> L;

    L.push_back(make_pair(begin(v1), end(v1)));
    L.push_back(make_pair(begin(v2), end(v2)));

    for(const auto& a : L){

        for(auto it = a.first; it != a.second; ++it)
        {
            cout << *it << '\n';
        }
    }
}

现在你有能力在知道结束迭代器时停止。