在C ++ 11中查找std :: set中的元素

时间:2016-02-23 18:18:31

标签: c++ c++11 set

将对象插入到std :: set中的关键是什么?至于下面的例子,我将类Classcomp的对象插入到std :: set中。但是,我想查找Classcomp的对象是否具有特定的' id = 1'是否存在于std :: set中?

#include <iostream>
#include <set>

struct Classcomp {
  int val = 0;
  int id = 0; ///ID for the object
  bool operator() (const Classcomp& lhs, const Classcomp& rhs) const
  {return lhs.val<rhs.val;}
};

int main ()
{

  Classcomp c1,c2,c3,c4;
  c1.val = 92;c1.id = 2;
  c2.val = 94;c2.id = 3;
  c3.val = 10;c3.id = 1;

  std::set<Classcomp,Classcomp> fifth;                 // class as Compare

    fifth.insert(c1);fifth.insert(c2);fifth.insert(c3);

    for (auto x: fifth) {std::cout << x.id << "  " << x.val << std::endl;} 

    if (fifth.find()) {std::cout << "Got it";} //What should I pass as arguments to fifth.find()?

  return 0;
}

2 个答案:

答案 0 :(得分:4)

集合与地图的不同之处在于集合中对象的。如果您需要将键与值分开,则需要一个键值容器,例如std::mapstd::unordered_map

<强>澄清 我不是在讨论简单地迭代集合中的所有对象并检查每个对象是否具有指定密钥的选项 - 这可以通过std::find轻松完成。如果那是你想要的,请澄清。

答案 1 :(得分:1)

由于您的课程按字段val排序,因此您有以下选项:

  • 遍历所有元素,并按std::findstd::find_if
  • 查找具有特定ID的元素
  • 创建另一个容器并按id排序(可能使用std :: share_ptr以避免重复)
  • 使用boost::multiindex并按val创建索引以及id