【问题标题】:Can one initialize a set by copying?可以通过复制来初始化一组吗?
【发布时间】:2018-10-19 05:25:11
【问题描述】:
std::vector<std::set<int>> m;
m[0].insert(0);
m[0].insert(1);
std::set<int> n = m[0]; // is this allowed?
for(std::set<int>::iterator iter = n.begin(); iter < n.end(); iter++)  // error in this line, "<" not defined.

我可以通过直接复制来初始化一个集合吗?最后一行有错误。

【问题讨论】:

  • 尝试的时候发生了什么?有错误吗?一个警告?它只是“不起作用”(如果没有,为什么不呢)?文档(对于 std::set)说什么可能表明一种或另一种方式?
  • 我想你想改用iter!=n.end();
  • 如何循环遍历一个没有从一个向量中的容器集合中复制的集合?
  • 使用++iter 而不是iter++...

标签: c++ stl


【解决方案1】:

我可以通过直接复制来初始化一个集合吗?

来自cppreference

从各种数据源构造新容器,并可选择使用用户提供的分配器 alloc 或比较函数对象 comp。
...
3) 复制构造函数。用 other 的内容的副本构造容器。 如果没有提供 alloc,则通过调用 std::allocator_traits::select_on_container_copy_construction(other.get_allocator()) 获得分配器。
...

您的代码中的问题:您定义了一个其中没有任何元素的向量,并尝试将元素更改为 0。
两种解决方案:

// Solution 1
std::vector<std::set<int>> m(1); // Define vector with one element

// Solution 2
std::vector<std::set<int>> m;
m.push_back(std::set<int>()); // Add new element to the vector with push_back
m.emplace_back(); // Add new element to the vector with emplace_back (recommended)

编辑:

对于最后一行,将&lt; 更改为!=

for(std::set<int>::iterator iter = n.begin(); iter != n.end(); iter++)

【讨论】:

【解决方案2】:
  • 我可以通过直接复制来初始化一个集合吗?

是的

  • 最后一行有错误

所写的 forloop 使用“iter 是否仍然小于集合中的结束迭代器。但是迭代器没有定义“!=。

  • 此外,您的向量不包含元素。所以 m[0] 访问越界。先放一个元素!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2011-10-12
    • 2020-08-26
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多