可以通过复制来初始化集吗?

时间:2018-10-19 05:25:11

标签: c++ stl

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.

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

2 个答案:

答案 0 :(得分:1)

  

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

来自cppreference

  

从各种数据源构造新容器,并可以选择使用用户提供的分配器alloc或比较函数对象comp。
...
  3)复制构造函数。 如果未提供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)

编辑:

对于最后一行,将<更改为!=

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

答案 1 :(得分:0)

  •   

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

  •   

    最后一行有错误

编写的forloop使用“ <”运算符比较iter是否仍然小于集合中的最终迭代器。但是迭代器没有定义“ <”运算符。这会导致错误消息。请改用!=

  • 此外,向量不包含元素。因此m [0]越界访问。首先放置一个元素!