2013-06-27 79 views
0

std::vector迭代器可以實現爲指針。推論是,如果向矢量添加元素,未完成的迭代器將顯然變爲無效,因爲通常矢量數據將不得不重新分配。無效的向量迭代器

關於確切規則的第一個猜測是允許的操作與指針的操作完全相同,例如,不要對一個無效的迭代器進行解引用,直到它被重新賦值爲一個有效的值,但這看起來並不完全正確,因爲微軟在調試模式下的實現有時會拋出一個異常,例如,減去指向不同數據塊的向量迭代器(當然,這對調試很有幫助)。

指針規則的附錄是否像'不要將迭代器減去不同的數據塊'或者'對無效迭代器進行任何運算,直到它被重新賦值爲有效值'或其他東西?

例如,以下程序(似乎在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; 
} 
+0

「迭代器指向不同的數據塊」是什麼意思? – jogojapan

+0

爲什麼示例程序無效?什麼時候發生了你認爲無效的事情? – jogojapan

+0

@jogojapan不同的向量,或添加新元素之前和之後相同向量的元素已導致重新分配。 – rwallace

回答

-1

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

+0

你能否具體解釋一下你所指的代碼部分?另請注意,僅僅使迭代器失效並不意味着程序無效。這僅僅意味着你不能用這個迭代器做某些事情。 – jogojapan