无法在std :: set上使用set_intersection

时间:2014-07-16 07:22:12

标签: c++

我正在尝试使用如下所述的set_intersection

std::set<std::pair<char*, int>,FileLinePairComapare > netSet;
std::set<std::pair<char*, int>,FileLinePairComapare > portSet;

std::set<std::pair<char*, int>,FileLinePairComapare> result;
std::set<std::pair<char*, int>,FileLinePairComapare>::iterator it;
std::set_intersection(netSet.begin(),netSet.end(),portSet.begin(),portSet.end(),result.begin());

我在最后一行收到编译错误

  

实例化'_Oite std :: set_intersection(_IIter1,_IIter1,   _IIter2,_IIter2,_Oter)[with _IIter1 = std :: _ Rb_tree_const_iterator&gt ;; _IIter2 =   std :: _ Rb_tree_const_iterator&gt ;; _OIter =   std :: _ Rb_tree_const_iterator&gt;]':

     

将'const std :: pair'作为'this'参数传递给   “的std ::对&安培;的std ::对::运算符=(const的   std :: pair&amp;)'丢弃限定符[-fpermissive]

我没有使用这些集合和set_intersection的cons函数。

1 个答案:

答案 0 :(得分:9)

您不能使用算法直接写入std::set迭代器。 所有 set迭代器都是const,并且有充分的理由因为更改任何值会破坏树(同样适用于std::map键 - map迭代器只能修改映射值。) / p>

即使你可能也行不通,因为容器是空的(例如,如果你试图使用std::vector作为目标容器,你最终会得到未定义的行为)。

使用std::inserter

std::set_intersection(
  netSet.begin(), netSet.end(),
  portSet.begin(), portSet.end(),
  std::inserter(result, result.end())
);