C ++如何在std :: vector <std :: unordered_set> </std :: unordered_set>中插入std :: set

时间:2014-06-19 21:32:09

标签: c++

如果我们有

std::set<int > a;
std::vector<std::unordered_set<int>> b;

我们在a

内插入了b

方法1:我们可以:

std::set<int > a;
std::vector<std::unordered_set<int>> b (a.begin(), a.end());

方法2,我们不能这样做?

std::set<int > a;
std::vector<std::unordered_set<int>> b;
b.insert(a.begin(), a.end()); 

此错误意味着什么?

  

错误C2664:   “的std :: _ Vector_iterator,性病:: equal_to&LT; _Kty&GT;,的std ::分配器&LT; _Kty&GT;&GT;&GT;&GT;&GT;   的std ::向量,性病:: equal_to&LT; _Kty&GT;,的std ::分配器&LT; _Kty&GT;&GT;,的std ::分配器&LT; _Ty&GT;&GT; ::插入(STD :: _ Vector_const_iterator,性病:: equal_to&LT; _Kty&GT;,标准::分配器&LT; _Kty&GT;&GT;&GT;&GT;&GT;无符号   int,const _Ty&amp;)':无法转换参数1   '的std :: _ Tree_const_iterator&GT;&GT;'   至   '的std :: _ Vector_const_iterator,性病:: equal_to&LT; _Kty&GT;,的std ::分配器&LT; _Kty&GT;&GT;&GT;&GT;&GT;'   IntelliSense:没有重载函数的实例“std :: vector&lt; _Ty,   _Alloc&gt; :: insert [with _Ty = std :: unordered_set,std :: equal_to,std :: allocator&gt;,   _Alloc = std :: allocator,std :: equal_to,std :: allocator&gt;&gt;]“匹配参数列表               参数类型是:(std :: _ Tree_const_iterator&gt;&gt;,   的std :: _ Tree_const_iterator&GT;&GT)               对象类型是:std :: vector,std :: equal_to,std :: allocator&gt;,   的std ::分配器,   std :: equal_to,std :: allocator&gt;&gt;&gt;

如果我们需要将b作为全球unordered_set来处理,那么解决方案是什么?

2 个答案:

答案 0 :(得分:3)

对于方法1,您可以按如下方式进行:

std::set<int> a{ 1, 2, 3, 4, 5};
std::vector<std::unordered_set<int>> b(1, std::unordered_set<int>(a.begin(), a.end()));

LIVE DEMO

对于方法二,您可以这样做:

std::set<int> a{ 1, 2, 3, 4, 5};
std::vector<std::unordered_set<int>> b(1);
b[0].insert(a.begin(), a.end());

LIVE DEMO

或者作为:

std::set<int> a{ 1, 2, 3, 4, 5};
std::vector<std::unordered_set<int>> b;
b.push_back({a.begin(), a.end()});

<强> LIVE DEMO

或者@Ben Voigt建议:

  std::set<int> a{ 1, 2, 3, 4, 5};
  std::vector<std::unordered_set<int>> b;
  b.emplace_back(a.begin(), a.end());

<强> LIVE DEMO

答案 1 :(得分:2)

方法2:

vector::insert()的重载不需要两个迭代器。试试这个:

b.insert( b.begin(), { a.begin(), a.end() } )