【问题标题】:std::vector randomly adds elements to vector [closed]std::vector 将元素随机添加到向量 [关闭]
【发布时间】:2016-04-06 08:54:48
【问题描述】:

我正在排序点,我为排序部分编写的代码运行良好,但我有一个问题。每隔一段时间(在随机时间)随机点被添加到向量的末尾,当我尝试 pop_back() 删除这些最后的元素时(因为我写了一小部分来检查以确保点的数量是同样),我最终陷入无限循环,试图删除这些最后的元素,这些元素不会消失。有什么我应该知道的吗?即使我不尝试删除它们,一些点也会随机消失。我试图了解我需要做些什么来防止这些奇怪的点弹出,因为这些点是按特定顺序排序的。

我只有三个insert方法,第一个是emplace_back(),下一个是insert,最后也是insert方法:

                if (afterX >= spheres.capacity())
                    spheres.emplace_back(center);
                else if(afterX == -1)
                    spheres.insert(spheres.begin(),center);
                else
                    spheres.insert(std::next( spheres.begin(), afterX ),center);
                elementCount++;

这是我的输出,以供参考:

Point: <5,0,0>
zFind: -1
<5,0,0>
Point: <10,0,0>
zFind: 0
yFind: 0
<5,0,0><10,0,0>
Point: <100,0,0>
zFind: 0
yFind: 0
<5,0,0><10,0,0><100,0,0><2.11207e-023,0,0>
Point: <30,0,0>
zFind: 0
yFind: 0
<5,0,0><10,0,0><30,0,0><100,0,0>
Point: <20,0,0>
zFind: 0
yFind: 0
<5,0,0><10,0,0><20,0,0><30,0,0><100,0,0><2.10934e-023,2.21351e+033,0><0,0,2.21351e+033><0,0,0>

正如您所看到的那样:点在系列中被正确添加(从最小到最大),但这些是最后存在然后消失的奇数额外数字。

谢谢, 西蒙

【问题讨论】:

  • 最有可能的是,在向量中插入和删除元素会使所有现有的迭代器失效。但是没有看到代码,很难给出真正的答案。
  • 只需推回元素并进行排序。简化您的代码。

标签: c++ random vector std c++14


【解决方案1】:

您在应该使用size 的地方使用capacitycapacity 返回向量中已分配元素的数量,该数量可以大于向量中存储的元素数量(即size)。访问 size 末尾之后的元素是未定义的行为

当您将元素添加到 size() == capacity() 的向量时,将分配新内存来保存整个向量(根据您在上面显示的内容,您的实现在需要时将容量加倍)。旧的内容被复制到新的内存中,新的元素被添加进来。

奇数的额外数字恰好位于为新内容分配的未初始化内存中。

在使用vector 的正常过程中,您很少需要访问capacity

【讨论】:

  • 谢谢!!!!这有帮助!!!!
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 2015-10-03
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2019-05-25
相关资源
最近更新 更多