STL容器中的持久引用

Aku*_*ete 6 c++ stl

使用C++ STL容器时,必须在什么条件下访问引用值?例如,在对容器的下一个函数调用之后,是否有任何引用无效?

{
std::vector<int> vector;
vector.push_back (1);
vector.push_back (2);
vector.push_back (3);

vector[0] = 10;       //modifies 0'th element

int& ref = vector[0];
ref = 10;             //modifies 0'th element

vector.push_back (4);
ref = 20;             //modifies 0'th element???

vector.clear ();
ref = 30;             //clearly obsurd
}
Run Code Online (Sandbox Code Playgroud)

据我所知,在stl的大多数实现中,这都可行,但我对标准声明的要求感兴趣.

--edit:我感兴趣因为我想尝试用于c ++ 的STXXL(http://stxxl.sourceforge.net/)库,但我意识到容器返回的引用并不是多次读取的持久性,因此不是兼容,而不对我现有的stl代码进行更改(无论多么肤浅).一个例子:

{
std::vector<int> vector;
vector.push_back (1);
vector.push_back (2);


int& refA = vector[0];
int& refB = vector[1]; //refA is not gaurenteed to be valid anymore
}
Run Code Online (Sandbox Code Playgroud)

我只是想知道这是否意味着STXXL容器不是100%兼容,或者确实如果我一直在以不安全/实现依赖的方式使用STL容器.

j_r*_*ker 12

关于插入向量,标准在23.2.4.3/1中说:

insert()如果新大小大于旧容量,则[ ]会导致重新分配.如果没有重新分配,插入点之前的所有迭代器和引用仍然有效.

(虽然这实际上是这样说的insert(),表68表明a.push_back(x)必须等同a.insert(a.end(), x)于任何向量a和值x.)这意味着如果你reserve()事先有足够的内存,那么(并且只有这样)迭代器和引用保证不会失效当你insert()push_back()更多项目.

关于删除项目,23.2.4.3/3说:

[ erase()]在擦除点之后使所有迭代器和引用无效.

根据表68和表67分别pop_back()clear()相当于到适当的调用erase().


aJ.*_*aJ. 8

矢量的一些基本规则:

  • 重新分配使向量元素的所有引用,指针和迭代器无效.
  • 插入可能使引用,指针和迭代器无效.
  • 插入或删除元素会使引用,引用和迭代器无效,这些引用,引用和迭代器引用以下元素.
  • 如果插入导致重新分配,则会使所有引用,迭代器和指针无效.