使用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().
矢量的一些基本规则:
| 归档时间: |
|
| 查看次数: |
1849 次 |
| 最近记录: |