Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无效向量迭代器_C++_Iterator_Std_Stdvector - Fatal编程技术网

C++ 无效向量迭代器

C++ 无效向量迭代器,c++,iterator,std,stdvector,C++,Iterator,Std,Stdvector,std::vector迭代器可以实现为指针。一个推论是,如果向向量添加元素,出色的迭代器显然将变得无效,因为通常必须重新分配向量数据 关于确切规则的第一个猜测是,允许的操作与指针的操作完全相同,例如,在重新分配有效值之前,不要取消对无效迭代器的引用,但这似乎并不完全正确,因为如果您(例如)减去指向不同数据块的向量迭代器(这确实有助于调试),Microsoft在调试模式下的实现有时会抛出异常 指针规则的附录是否类似于“不要将迭代器减去不同的数据块”或“在重新分配有效值之前不要对无效迭代器执行任何算

std::vector
迭代器可以实现为指针。一个推论是,如果向向量添加元素,出色的迭代器显然将变得无效,因为通常必须重新分配向量数据

关于确切规则的第一个猜测是,允许的操作与指针的操作完全相同,例如,在重新分配有效值之前,不要取消对无效迭代器的引用,但这似乎并不完全正确,因为如果您(例如)减去指向不同数据块的向量迭代器(这确实有助于调试),Microsoft在调试模式下的实现有时会抛出异常

指针规则的附录是否类似于“不要将迭代器减去不同的数据块”或“在重新分配有效值之前不要对无效迭代器执行任何算术”或其他内容

例如,下面的程序(它在微软C++和GCC上都有效)是有效的吗?

#包括
#包括
#包括
使用std::cout;
使用std::ostream;
使用std::vector;

模板ostream&operator您的示例无效,它之所以有效是因为运气。每个可能导致向量重新分配的操作都可能使所有迭代器无效。

您所说的“指向不同数据块的迭代器”到底是什么意思?为什么示例程序无效?什么时候发生了你认为无效的事情?@rwallace Ok。从不同向量中减去(然后取消引用)迭代器是无效的(但这与指针相同)。从重新分配之前和之后减去(然后取消引用)迭代器是无效的两个(与重新分配常规数组时相同)。@TomerArazy但插入后使用
begin(v)
重置
i
。这是完全正确的。我的错误,它可能不是未定义的,它只是有太多名为
i
的变量。你能解释一下你具体指的是代码的哪一部分吗?还要注意,仅仅使迭代器无效并不意味着程序无效。它只是意味着有些事情你不能用迭代器去做。
#include <algorithm>
#include <iostream>
#include <vector>

using std::cout;
using std::ostream;
using std::vector;

template<class T> ostream& operator<<(ostream& os, vector<T>& v) {
    os << '[';
    bool c = 0;
    for (auto a: v) {
        if (c)
            os << ", ";
        c = 1;
        os << a;
    }
    return os << ']';
}

void f(vector<int>& v, vector<int>::iterator& i) {
    *i = 10;
    for (int j = 0; j < 10; j++)
        v.insert(begin(v), j);
    i = begin(v)+5;
}

int main() {
    vector<int> v;
    for (int i = 0; i < 10; i++)
        v.push_back(i);
    auto i = begin(v)+5;
    f(v, i);
    i[1] = 11;
    cout << v << '\n';
    return 0;
}