迭代器不能被另一个相同大小的向量重用?

时间:2014-03-03 03:37:55

标签: c++ pointers

vector< vector<int> >::iterator row;
vector<int>::iterator col;
vector<int>::iterator col2;



for (row = vec.begin(); row != vec.end(); row++) {

    col2 = row->begin(); //this needs to be row2 and row2 must be assigned with vec2.begin();

    for (col = row->begin(); col != row->end(); col++) {
    vec[col] = 23; //doesn't work because col is a pointer
    *col = 23;
    *col2 = 23; //overrides value pointed by *col


    col2++; 
    }

}

我很困惑,因为当我打印迭代器时,我得到索引值,所以我假设&lt;&lt;运算符被重载以提供索引值,而不是迭代器指向的地址。

3 个答案:

答案 0 :(得分:1)

对您的问题的简短回答是否定的,您不能安全地从另一个容器的一个实例重用迭代器。如果将迭代器视为指针,这一点就更加清晰了。

int* pI = &some_int;

如果我取消引用pI,我希望获得some_int的值。它同时也不能指向some_other_int

如果没有一些特定的有用代码,我无法提出替代解决方案。但是,由于std::vector支持随机访问,如果您想访问相同大小的不同向量的2个元素,则可以改为使用索引:

std::vector<int> vec1(100, 1); // 100 elements initialized to 1
std::vector<int> vec2(100, 2); // 100 elements initialized to 2
std::vector<int> vec3(100);
for (std::size_t i = 0; i < vec1.size(); ++i) // we already know vec1, vec2, and vec3 are all the same size
{
    vec3[i] = vec1[i] + vec2[i];
}

答案 1 :(得分:0)

我想你想要:

vector< vector<int> >::iterator row;
vector<int>::iterator col;
vector<int>::iterator col2;
for (row = vec.begin(); row != vec.end(); row++) {
    col2 = row->begin();
    for (col = row->begin(); col != row->end(); col++) {
        vec[col - row->begin()] = 23;
        *col = 23;
        *col2 = 23;
        col2++;
    }
}

答案 2 :(得分:0)

row2 = vec2->begin();
for (row = vec.begin(); row != vec.end(); row++)
{
    // ...
    row2++; 
}

这只是困扰你的语法吗?事实上,一个迭代器是在循环头中处理的,而另一个是在其他地方处理的?因为可以在循环头中处理两个迭代器:

for (row = vec.begin(), row2 = vec2->begin(); row != vec.end(); row++, row2++)
{
    // ...
}