如何将矢量转换为设置?

Mar*_*ius 38 c++ vector set

我有一个矢量,我保存对象.我需要将其转换为设置.我一直在阅读关于集合的内容,但我仍然有几个问题:

如何正确初始化它?老实说,一些教程说初始化就好了set<ObjectName> something.其他人说你也需要一个迭代器,比如set<Iterator, ObjectName> something.

如何正确插入它们.再说一次,这就足够了something.insert(object)吗?

如何从set中获取特定对象(例如对象,其中包含名称变量,等于"ben")?

PS我有自己的转换矢量作为一个集(又名我必须使用集而不是矢量).只有set可以在我的代码中.

mas*_*oud 113

假设你有一个字符串向量,将它转换为一个集合你可以:

std::vector<std::string> v;

std::set<std::string> s(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

对于其他类型,您必须已operator<定义.


Dav*_*vid 44

到目前为止,所有答案都已复制vector到a set.由于你要求'转换'a vector到a set,我将展示一个更优化的方法,它将每个元素移动到a set而不是复制每个元素:

std::vector<T> v = /*...*/;

std::set<T> s(std::make_move_iterator(v.begin()),
              std::make_move_iterator(v.end()));
Run Code Online (Sandbox Code Playgroud)

注意,您需要C++ 11支持.


izo*_*ica 12

您可以按以下方式使用向量中的对象初始化集合:

vector<T> a;
... some stuff ...
set<T> s(a.begin(), a.end());
Run Code Online (Sandbox Code Playgroud)

这是简单的部分.现在,你必须意识到,为了将元素存储在一个集合中,你需要让bool operator<(const T&a, const T& b)运算符重载.同样在一个集合中,根据运算符定义,您可以拥有不超过一个具有给定值的元素.所以在集合中s你不能有两个既不是operator<(a,b)也不operator<(b,a)是真的元素.只要你知道并意识到你应该好好去.


Zac*_*and 7

如果你想要做的就是将你已经拥有的元素存储在一个向量中,在一个集合中:

std::vector<int> vec;
// fill the vector
std::set<int> myset(vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)


Bet*_*eta 5

你没有告诉我们你的对象,但假设你有这样一个类:

class Thing
{
public:
  int n;
  double x;
  string name;
};
Run Code Online (Sandbox Code Playgroud)

你想把一些东西放到一个集合中,所以你试试这个:

Thing A;
set<Thing> S;
S.insert(A);
Run Code Online (Sandbox Code Playgroud)

这失败了,因为集合已经排序,并且没有办法对Things进行排序,因为没有办法比较它们中的两个.你必须提供operator<:

class Thing
{
public:
  int n;
  double x;
  string name;

  bool operator<(const Thing &Other) const;
};

bool Thing::operator<(const Thing &Other) const
{
  return(Other.n<n);
}

...
set<Thing> S;
Run Code Online (Sandbox Code Playgroud)

比较函数对象:

class Thing
{
public:
  int n;
  double x;
  string name;
};

struct ltThing
{
  bool operator()(const Thing &T1, const Thing &T2) const
  {
    return(T1.x < T2.x);
  }
};

...
set<Thing, ltThing> S;
Run Code Online (Sandbox Code Playgroud)

要查找名称为"ben"的Thing,您可以遍历该集合,但如果您更具体地告诉我们您想要做什么,那将会非常有用.