Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在调整向量大小时,有什么方法可以防止引用和对象之间的中断?_C++ - Fatal编程技术网

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:你不能把引用放在一个向量中。仅仅跟踪向量中的一个对象似乎太过分了。它怎么知道呢