我试图在列表中使用迭代器,如下所示,这是正确的方法吗?
我有两个向量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;
}
答案 0 :(得分:2)
崩溃来自于尝试在it
行中取消引用while(*it){
。如果向量v
为空,则迭代器v.begin()
将不指向有效内存,并且取消引用它将导致分段错误。
答案 1 :(得分:0)
list<vector<int>::iterator> l;
l.push_back(it1);
如果假设v1
为空,那么it1
将是v1::end()
,它是向量的最后一个元素之后的一个,并且不是向量的一部分。所以稍后当你做1} p>
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';
}
}
}
现在你有能力在知道结束迭代器时停止。