我正在尝试编写一个数据结构,我可以使用向量循环,循环列表。我调整大小我认为应该使用十个元素初始化底层数组。我不明白为什么我不能推进迭代器。有人可以帮忙。
我不能使用push_back(),因为它总会附加到不是我想要的结尾。
// re-use start of vector when get to end
#include <vector>
#include <iostream>
#include <algorithm>
using std::cout;
using std::endl;
using std::vector;
class printme {
public:
void operator() (int val) {cout << val << endl; }
};
//get a debug assertion - message says: vector iterators incompatible
//I assume this means that it is invalid after previous it++
int main(int argc, char* argv[])
{
vector<int> myvec;
myvec.resize(10); //underlying array now has size=10 elements
vector<int>::iterator it = myvec.begin(); //point to start of array
for(int i = 0; i < 100; ++i) {
if(it == myvec.end()) //on 2nd iteration crashes here - invalid iterator
it = myvec.begin();
myvec.insert(it++, i);
}
//print contents of vector - check 90-99 printed
for_each(myvec.begin(), myvec.end(), printme());
return 0;
}
EDIT 将循环更改为:
for(int i = 0; i < 100; ++i) {
if(it == myvec.end())
it = myvec.begin();
*it++ = i;
}
我没有正确理解插入。
答案 0 :(得分:1)
根据您对输出的期望 - 我相信您误解了insert
正在做什么。
以这种方式实现你的循环(没有insering - 只是替换)。 std::vector<>::insert
将向量的大小增加1 - 我相信这不是您所期望的。
不要这样做:
myvec.insert(it++, i);
但是这个:
*it++ = i;
然后你会得到你想要的输出:
//print contents of vector - check 90-99 printed
for_each(myvec.begin(), myvec.end(), printme());
答案 1 :(得分:0)
迭代器可能会被向量上的某些操作失效 - 包括insert
。您需要重新构建it
才能在insert
之后使用它。
vector<int>::iterator it = myvec.begin(); //point to start of array
for(int i = 0; i < 100; ++i) {
if(it == myvec.end()) //on 2nd iteration crashes here - invalid iterator
it = myvec.begin();
myvec.insert(it++, i);
//it can be invalid here, re-fetch it
it = myvec.begin();
}