【问题标题】:Safe to iterate over std::vector<some_container> while modifying <some_container>'s size?在修改 <some_container> 的大小时迭代 std::vector<some_container> 是否安全?
【发布时间】:2015-09-21 17:53:52
【问题描述】:

假设我有一个其他容器类型的向量。在迭代向量时,我更改了容器的大小。鉴于向量试图在系统内存中保持连续,指针算术会在这样的循环中失败吗?例如,

#include <stdlib.h>
#include <vector>

using namespace std;

int main(){
  vector<vector<double> > vec_vec(4);
  for (auto i=vec_vec.begin(); i!=vec_vec.end(); ++i){
    for (double j=0; j<100; j+=1.0){
      i->push_back(j)
    };
  };

  return 0;
}

到目前为止,我在使用这样的代码时没有遇到任何问题,但现在我想知道我是不是走运了。这安全吗?是否取决于向量内使用的容器类型?

【问题讨论】:

    标签: c++ stdvector


    【解决方案1】:

    没关系,你没有改变外部向量。但是,不能保证所有向量在内存中都是连续的。每个单独的内心都会有,但不要指望它们在记忆中一个接一个地排列。

    【讨论】:

    • for 循环有什么问题?它不是遍历向量,而是生成要存储到其中的数据。
    • @DanielJour 与 doubles 的循环通常很糟糕,因为浮点错误。
    • 只要您不尝试在循环条件中比较相等性,这种循环的使用是完全有效的,假设需要 1.5 的步长。
    • @DanielJour 好的,我同意这种情况,并删除了评论,但是在 OPs 情况下,假设步长为 1,应该使用int,它将自动转换为double在作业中。
    【解决方案2】:

    您正在修改您正在迭代的std::vector 的内容。没有您正在迭代的向量。它们是不同的东西。

    第一个是安全的。由于最终的内存重新分配,第二个不安全。

    【讨论】:

      【解决方案3】:

      向量是一个固定大小的管理对象(大小、保留、指针),其连续内存由指针指向。

      因此您不会更改对象的大小

      【讨论】:

        猜你喜欢
        • 2014-02-22
        • 1970-01-01
        • 2018-12-10
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 1970-01-01
        相关资源
        最近更新 更多