簡體   English   中英

無效的向量迭代器

[英]Invalid vector iterators

std::vector迭代器可以實現為指針。 結果是,如果向向量添加元素,則明顯的迭代器顯然將變得無效,因為通常必須重新分配向量數據。

關於確切規則的第一個猜想是,允許的操作與指針的操作完全相同,例如在重新分配有效值之前不要取消引用無效的迭代器,但這似乎並不正確,因為Microsoft的如果您例如減去指向不同數據塊的向量迭代器,則調試模式下的實現有時會引發異常(當然,這對調試很有幫助)。

指針規則的附錄是否是諸如“不要將迭代器減去到不同的數據塊”或“在對無效的迭代器進行重新分配有效值之前不對其進行任何算術”之類的事情?

例如,以下程序(似乎可以同時在Microsoft C ++和GCC上運行)是否有效?

#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;
}

您的示例無效,它起作用的原因是運氣。 每個可能導致向量重新分配的操作都可能使所有迭代器無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM