web-dev-qa-db-ja.com

ベクトルをセットに変換する方法は?

オブジェクトを保存するベクターがあります。セットに変換する必要があります。セットについて読んでいますが、まだいくつか質問があります。

正しく初期化する方法は?正直なところ、一部のチュートリアルでは、_set<ObjectName> something_のように初期化しても問題ありません。 _set<Iterator, ObjectName> something_のようなイテレータも必要だと言う人もいます。

それらを正しく挿入する方法。繰り返しますが、単にsomething.insert(object)と書くだけで十分ですか?それですべてですか?

セットから特定のオブジェクト(たとえば、「ben」に等しい名前変数を持つオブジェクト)を取得する方法は?

追伸私はそれをセットとしてベクトルに変換しました(別名、ベクトルではなくセットを使用する必要があります)。コードに設定できるのはセットのみです。

37
Marius

オブジェクトについてはあまり説明していませんが、次のようなクラスがあるとします。

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

いくつかのものをセットに入れたいので、これを試してください:

Thing A;
set<Thing> S;
S.insert(A);

セットはソートされるため、これは失敗します。また、2つのセットを比較する方法がないため、モノをソートする方法がありません。 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;

または比較関数オブジェクト

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;

名前が「ben」であるThingを見つけるには、セットを反復処理できますが、何をしたいのかを具体的に教えてくれれば本当に助かります。

5
Beta

文字列のベクトルがあり、それをセットに変換するとします:

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

std::set<std::string> s(v.begin(), v.end());

他のタイプの場合、operator<定義済み。

109
deepmax

これまでの回答はすべて、vectorsetにコピーしました。 vectorsetに '変換'するように求めたので、各要素をコピーする代わりに、各要素をsetに移動する、より最適化された方法を示します。

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

std::set<T> s(std::make_move_iterator(v.begin()),
              std::make_move_iterator(v.end()));

これにはC++ 11のサポートが必要です。

43
David

ベクトル内のオブジェクトを使用して、次の方法でセットを初期化できます。

_vector<T> a;
... some stuff ...
set<T> s(a.begin(), a.end());
_

これは簡単な部分です。ここで、要素をセットに格納するには、bool operator<(const T&a, const T& b)演算子をオーバーロードする必要があることを理解する必要があります。また、セットでは、指定された値を持つ要素を1つしか持つことはできません演算子定義による。したがって、セットsには、operator<(a,b)operator<(b,a)もtrueでない2つの要素を含めることはできません。あなたが行くのが良いはずであることを知っていて、理解している限り。

12

あなたがしたいのがあなたが既に持っている要素をベクトルにセットで保存することである場合:

std::vector<int> vec;
// fill the vector
std::set<int> myset(vec.begin(), vec.end());
7
Zac Howland

セットの作成は、ベクターの作成と同じです。どこにいる

std::vector<int> my_vec;

(またはintではなく他のタイプ)で置き換えます

std::set<int> my_set;

セットに要素を追加するには、insertを使用します。

my_set.insert(3);
my_set.insert(2);
my_set.insert(1);
1
Pete Becker

正しく初期化する方法は?

_std::set<YourType> set;
_

唯一の条件は、YourTypebool operator<(const YourType&) constを持ち、コピー可能(デフォルトのコンストラクター+代入演算子)でなければならないことです。 _std::vector_の場合、コピー可能で十分です。

それらを正しく挿入する方法。

_set.insert(my_elem);
_

セットから特定のオブジェクト(たとえば、「ben」に等しい名前変数を持つオブジェクト)を取得する方法は?

それがポイントかもしれません。オブジェクトが内部にあることを確認するか、セット全体を反復処理することができる場合、セットは単なるオブジェクトの集まりです。

1
Johan