为什么这里不允许迭代集合和修改元素

问题描述 投票:0回答:1

在下面的代码中,我们无法使用非常量引用来迭代集合

s1
。为什么?

#include <set>

struct st {
  unsigned int f;
  std::set<int> s2;
};

struct comp {
  bool operator()(const st &lhs, const st &rhs) const {
    return lhs.f < rhs.f;
  }
};

int main() {
  std::set<st, comp> s1;
  st x;

  for (st &m : s1) // error here. requires const st&
    m.s2.insert(begin(x.s2), end(x.s2));

  return 0;
}
c++ c++11 set auto
1个回答
0
投票

来自 C++17 标准(26.2.6 关联容器)

5 对于集合和多重集,值类型与键类型相同。 对于地图和多重地图,它等于pair

6 关联容器的迭代器是双向的 迭代器类别。 对于值类型的关联容器 与 key 类型相同,iterator 和 const_iterator 都是 常量迭代器。

因此在这个基于范围的 for 循环中

for (st &m : s1)

你不能使用非常量引用。

注意您创建了一个空集。

std::set<st, comp> s1;

所以无论如何循环都没有意义。

© www.soinside.com 2019 - 2024. All rights reserved.