C++ 在调整向量大小时,有什么方法可以防止引用和对象之间的中断?
我调试了一个问题,意识到当一个向量调整大小时,引用将不再工作。为了说明这一点,下面是最简单的代码。输出为C++ 在调整向量大小时,有什么方法可以防止引用和对象之间的中断?,c++,C++,我调试了一个问题,意识到当一个向量调整大小时,引用将不再工作。为了说明这一点,下面是最简单的代码。输出为0,而不是1。除了为x保留一个较大的空间之外,我们还有什么方法可以防止这种情况发生 #include <iostream> #include <vector> using namespace std; vector<int> x{}; int main(){ x.reserve(1); x.push_back(0); int & y
0
,而不是1
。除了为x保留一个较大的空间之外,我们还有什么方法可以防止这种情况发生
#include <iostream>
#include <vector>
using namespace std;
vector<int> x{};
int main(){
x.reserve(1);
x.push_back(0);
int & y = x[0];
x.resize(10);
y=1;
cout << x[0] << endl;
return 0;
}
#包括
#包括
使用名称空间std;
向量x{};
int main(){
x、 储备(1);
x、 推回(0);
int&y=x[0];
x、 调整大小(10);
y=1;
cout这被称为无效,防止无效的唯一方法是确保向量容量不变
x.reserve(10);
x.push_back(0);
int &y = x[0];
x.resize(10);
这被称为无效,防止这种情况发生的唯一方法是确保向量容量不变
x.reserve(10);
x.push_back(0);
int &y = x[0];
x.resize(10);
有几种选择:
不要使用向量
不要保留推荐人
创建一个“智能参考”类,跟踪向量和索引,这样即使向量移动,它也能获得适当的对象
有几种选择:
不要使用向量
不要保留推荐人
创建一个“智能参考”类,跟踪向量和索引,这样即使向量移动,它也能获得适当的对象
您还可以创建一个std::shared_ptr
向量,并保留值而不是interator。您还可以创建一个std::shared_ptr
向量,并保留值而不是interator。我能想到的唯一方法是使用std::deque
而不是std::vector
建议std::deque
的原因如下(参考文献):
deque的存储会根据需要自动扩展和收缩
需要。扩展deque比扩展
std::vector,因为它不涉及对现有
元素添加到新的内存位置。
关于不复制的那句话实际上就是你问题的答案。它意味着只要对象还活着,对象就会一直保留在你放置它们的位置(在内存中)
然而,在下一行,它说:
另一方面,DEQUE通常具有较大的最小内存开销;a
只包含一个元素的deque必须分配其完整的内部数组
(例如,64位libstdc++上对象大小的8倍;对象大小的16倍)
大小或4096字节,以较大者为准,在64位libc++上)
现在由你来决定哪一个更好——更高的初始内存成本或改变程序的逻辑,而不需要引用向量中的项目,也可能要考虑<代码> STD::SET 或<代码> STD::unOrdEdEdSub < /C> >快速查找容器内的对象< /P> < P> >我唯一能想到的方法是:使用
std::deque
代替std::vector
建议std::deque
的原因如下(参考文献):
deque的存储会根据需要自动扩展和收缩
需要。扩展deque比扩展
std::vector,因为它不涉及对现有
元素添加到新的内存位置。
关于不复制的那句话实际上就是你问题的答案。它意味着只要对象还活着,对象就会一直保留在你放置它们的位置(在内存中)
然而,在下一行,它说:
另一方面,DEQUE通常具有较大的最小内存开销;a
只包含一个元素的deque必须分配其完整的内部数组
(例如,64位libstdc++上对象大小的8倍;对象大小的16倍)
大小或4096字节,以较大者为准,在64位libc++上)
现在由你来决定哪一个更好——更高的初始内存成本或改变程序的逻辑,而不需要引用向量中的项目,也可能要考虑<代码> STD::SET或<代码> STD::unOrdEdEdSub < /C> >快速查找容器内的对象
将找到一个新的内存位置/地址以创建所需的空间。在调整大小后,您需要再次将y分配给x[0]。OmidCompSCI有时push_back()会隐式触发调整大小以使错误难以找到。解决此问题的最佳做法是什么?如果确实需要此功能,请使用deque而不是矢量“最佳实践”-不要在要调整大小的向量中保留对元素的引用。如果它们变得更聪明,它们将不得不复制对象:)。reserve()将找到一个新的内存位置/地址来创建所需的空间。在调整大小后,您需要再次将y指定给x[0]。@OmidCompSCI有时会推回()可以隐式触发resize以使bug难以找到。有解决此问题的最佳做法吗?如果确实需要此功能,请使用deque而不是vector“最佳做法”-不要在要调整大小的向量中保留对元素的引用。如果它们变得更聪明,它们将不得不复制对象:)如果要这样做,那么调整大小是没有意义的,但是是的,很好的解释这是唯一能产生正确结果的答案,只要你事先知道向量有多大ctor应该是。否则,我认为最好的办法是使用std::deque
@DrPhil:你不能在向量中放置引用。如果你这样做,那么调整大小就没有意义了,但是是的,很好的解释这是唯一一个能够产生正确结果的答案,只要你事先知道向量有多大是的。否则,我认为最好的办法是使用std::deque
@DrPhil:你不能把引用放在一个向量中。仅仅跟踪向量中的一个对象似乎太过分了。它怎么知道呢