将 std::vector 收缩以适应对向量本身的引用无效
Would std::vector shrink to fit invalidate a reference to the vector itself?
我想知道确切
的含义 std::vector<T>::shrink_to_fit(new_capacity)
会使引用无效。
"如果发生重新分配,所有迭代器、指针和引用 与容器相关的容器失效。否则,没有任何变化。
http://www.cplusplus.com/reference/vector/vector/shrink_to_fit/
测试代码:
#include <vector>
#include <iostream>
class Test {
public:
Test(const std::vector<int>& a) : _a(a) {}
void print() const {
std::cout << "[";
for (auto x:_a) std::cout << " " << x;
std::cout << " ]n";
}
const std::vector<int>& _a;
};
int main() {
std::vector<int> a;
a.reserve(100);
for (int i = 0; i < 10; ++i) a.push_back(i);
Test t(a);
t.print();
a.shrink_to_fit();
t.print(); // will this always work as expected?
}
如果new_capacity
小于old_capacity
(因此vector
的容量缩小),引用(测试类的_a
属性)是否可以失效?
你所指的段落的意思是,迭代器或对调整向量大小的元素的引用可能会变得无效。
在_a
是引用的情况下,正如您的注释所建议的那样,_a
将继续是对向量的有效引用,但_a
中的任何迭代器或对元素的引用都将无效。
是的
,如果发生重新分配,std::vector::shrink_to_fit()
会使引用无效。但是与您的示例代码无关 - 对向量保存的数据的引用或指针将失效,而不是对向量本身的引用:
std::vector<int> v( 10 );
std::vector<int> &vref = v;
int &ref = v[0];
v.resize(2);
v.shrink_to_fit();
// now ref could be invalid, but vref is perfectly fine
如果new_capacity小于old_capacity(因此向量的容量缩小),引用(测试类的_a属性)是否可以失效?
否,Test::_a
在以下情况下不会失效:
a.shrink_to_fit();
如果你有一个std::vector<int>::iterator _aitr;
,它将指向a
的某个元素,那么这样的迭代器将被失效。
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 创建引用向量的优雅方式
- C++重新引用向量中的值
- 很好的语法来获取对向量/数组数据的大小引用?
- 如何返回向量的常量引用?
- 取消引用向量时出现问题
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 通过引用传递向量是请求 std::分配器
- 从类返回引用向量
- 返回两个向量 – 使用引用还是元组?
- 在C++中通过引用传递向量数组
- 引用向量中的特定索引
- 如何告诉自动推断向量<bool>元素的非引用类型
- 如何在方法主体中返回声明向量的引用?
- 向量引用C++
- 在向量引用上调用 vector::reserve()
- 如何创建一个同时接受数组和向量引用的函数模板
- 如何做列表的向量引用列表中的值
- c++向量引用转换
- 最方便的表示向量引用的向量的方法