【问题标题】:Reset vector of vector (2D array) to zero将向量(二维数组)的向量重置为零
【发布时间】:2015-09-23 17:57:21
【问题描述】:

我正在使用向量的向量来模拟二维数组。为了重用这个二维数组,有时我需要将其所有元素重置为零或某个默认值。我知道我可以做一个简单的一维向量:

std::fill(v.begin(), v.end(), 0);

如何有效地为vector<vector<int>> 做到这一点?我希望找到一个不使用 for 循环但更类似于某些 memset 变体的解决方案。我也不想招致任何内存分配和释放,因为我的意图是重用现有分配的内存。

请注意,我假设每个向量的大小是固定的并且我知道:vector<vector<int>> v(const_max_size, vector<int> (const_max_size, 0));。如何将v的元素重置为零?

注意:我不使用 for 循环的意思是,我不想使用像 v[i][j] 这样的下标来遍历所有 2D 元素来为它们分配价值。

【问题讨论】:

  • 内层向量的存储在内存中是不连续的,所以没有办法不遍历外层向量。

标签: c++ c++11 vector


【解决方案1】:

希望在不使用for循环的情况下找到解决方案...

好吧,要么显式地执行循环,要么使用隐式循环的东西。显式循环没有错:

for (auto& sub : v) {
    std::fill(sub.begin(), sub.end(), 0);
}

我想从技术上讲,如果您想避免可以使用的循环:

std::for_each(v.begin(), v.end(),
              [](auto& sub) {
                  std::fill(sub.begin(), sub.end(), 0);
              });

【讨论】:

  • lambda 中的 (auto& sub) 部分对 c++11 有效吗?还是 c++14?如何检查?
  • @Rich 通用 lambda 是 C++14 特性
【解决方案2】:

我知道我会因为这个答案而大吃一惊,但我确信没有什么比这更快了:

for(auto& x : v) memset(&x[0],0,sizeof(int)*x.size());

memset 针对设置为 0 进行了高度优化。

【讨论】:

  • 你的意思是sizeof(int)*x.size() 吗?
  • 如果代码更改为使用不同的数据结构会发生什么?
  • 这是你的防弹夹克。 :)
  • @NeilKirk 你是什么意思?您的意思是,如果我将向量的向量更改为其他内容怎么办?我想最好将我的数据结构和所需的操作封装到一个类中?
  • @Rich 我的意思是,如果您将内部向量更改为诸如列表之类的其他内容,则此解决方案将不起作用,因此它不那么健壮。
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多