オブジェクトを保存するベクターがあります。セットに変換する必要があります。セットについて読んでいますが、まだいくつか質問があります。
正しく初期化する方法は?正直なところ、一部のチュートリアルでは、_set<ObjectName> something
_のように初期化しても問題ありません。 _set<Iterator, ObjectName> something
_のようなイテレータも必要だと言う人もいます。
それらを正しく挿入する方法。繰り返しますが、単にsomething.insert(object)
と書くだけで十分ですか?それですべてですか?
セットから特定のオブジェクト(たとえば、「ben」に等しい名前変数を持つオブジェクト)を取得する方法は?
追伸私はそれをセットとしてベクトルに変換しました(別名、ベクトルではなくセットを使用する必要があります)。コードに設定できるのはセットのみです。
オブジェクトについてはあまり説明していませんが、次のようなクラスがあるとします。
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を見つけるには、セットを反復処理できますが、何をしたいのかを具体的に教えてくれれば本当に助かります。
文字列のベクトルがあり、それをセットに変換するとします:
std::vector<std::string> v;
std::set<std::string> s(v.begin(), v.end());
他のタイプの場合、operator<
定義済み。
これまでの回答はすべて、vector
をset
にコピーしました。 vector
をset
に '変換'するように求めたので、各要素をコピーする代わりに、各要素をset
に移動する、より最適化された方法を示します。
std::vector<T> v = /*...*/;
std::set<T> s(std::make_move_iterator(v.begin()),
std::make_move_iterator(v.end()));
これにはC++ 11のサポートが必要です。
ベクトル内のオブジェクトを使用して、次の方法でセットを初期化できます。
_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つの要素を含めることはできません。あなたが行くのが良いはずであることを知っていて、理解している限り。
あなたがしたいのがあなたが既に持っている要素をベクトルにセットで保存することである場合:
std::vector<int> vec;
// fill the vector
std::set<int> myset(vec.begin(), vec.end());
セットの作成は、ベクターの作成と同じです。どこにいる
std::vector<int> my_vec;
(またはint
ではなく他のタイプ)で置き換えます
std::set<int> my_set;
セットに要素を追加するには、insert
を使用します。
my_set.insert(3);
my_set.insert(2);
my_set.insert(1);
正しく初期化する方法は?
_std::set<YourType> set;
_
唯一の条件は、YourType
がbool operator<(const YourType&) const
を持ち、コピー可能(デフォルトのコンストラクター+代入演算子)でなければならないことです。 _std::vector
_の場合、コピー可能で十分です。
それらを正しく挿入する方法。
_set.insert(my_elem);
_
セットから特定のオブジェクト(たとえば、「ben」に等しい名前変数を持つオブジェクト)を取得する方法は?
それがポイントかもしれません。オブジェクトが内部にあることを確認するか、セット全体を反復処理することができる場合、セットは単なるオブジェクトの集まりです。