簡體   English   中英

為什么此向量迭代器不會失效?

[英]Why does this vector iterator not become invalidated?

我讀過一些有關迭代器失效的文章,似乎要求向量重新分配的插入會使迭代器失效。 同樣不應該在向量中間擦除導致無效嗎?

我對此沒有一個清晰的了解,不知道為什么在從開始,中間和結束調整大小和擦除之后使用這些迭代器不會破壞它們:

#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char** argv) {

    vector<int> v;
    v.reserve(10);

    for (int i = 0; i < 10; i++)
        v.push_back(i);

    for (auto x = v.begin(); x != v.end(); x++) {
        cout << *x << endl;
    }

    cout << endl << "RESIZE" << endl << endl;

    for (int i = 10; i < 20; i++)
        v.push_back(i);

    for (auto x = v.begin(); x != v.end(); x++) {
        cout << *x << endl;
    }

    cout << endl << "RESIZE 2" << endl << endl;

    for (int i = 20; i < 200; i++)
        v.push_back(i);

    for (auto x = v.begin(); x != v.end(); x++) {
        cout << *x << endl;
    }

    cout << endl << "REMOVES" << endl << endl;

    v.erase(v.begin());
    v.pop_back();
    v.erase(v.begin() + 17);

    for (auto x = v.begin(); x != v.end(); x++) {
        cout << *x << endl;
    }

    return 0;
}

請注意,調用begin()或end()將始終提供合理的迭代器

但是類似:

std:vector<int> v;
....

std::vector<int>::iterator i=v.begin();
v.erase(i);
std::cout << *i << std::endl;  // i iterator was invalidated by erasing it
                               // trying to access it or increment it is undefined behaviour.
std::cout << *v.begin() << std::endl;  // begin() provides always a sane iterator.

在您的代碼中,總是在重復使用迭代器時,不會對向量進行中間修改,因此也不會導致無效。

調整大小和插入時,迭代器可能會失效。 擦除僅會使被擦除元素處或之后的迭代器無效。

至少,這些是std::vector的釋義規則。

暫無
暫無

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

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