1

質問をしたところstd::setですが、もう少し考えてみると、問題を簡単なものに絞り込んだと思います。

ユニークなアイテムのセットがあります。ベクトル内の各要素がセット内のアイテムを指すベクトルを作成したいと思います。

だから、私は(ユニークな)Aオブジェクトのセットを持っています:

class A
{
    int i;
};

std::set<A, compareclass> mySet;

およびA*のベクトル:

std::vector<A*> myVec;

set::insert()セット内の要素(挿入されているか、すでに存在している)へのイテレータを含むペアを返します。技術的には、次のようなアドレスを取得できます。

ret = myset.insert(A());
myVec.push_back(&(*ret.first));   

でも、それはいい考えではないかもしれないと思っています。ベクトル要素がセット内の特定のオブジェクトを指すようにする他の方法はありますか?

4

3 に答える 3

1

I'm thinking that might not be a great idea、 なんでそう思うのですか?私があなたに見ている唯一のことは、所有権を明確にするために、プレーンポインターの代わりにスマートポインターの線に沿って何かを使用し、それに伴うメモリリークの間違いを回避することです。

または、Jerryが提案したように、イテレータはさらに優れています。

于 2012-11-20T23:32:56.677 に答える
0

もし私があなたなら、オブジェクトをヒープに割り当て、shared_ptrそれらへのスマートポインタ(例)をセットとベクトルの両方に格納します。

私の見解では、これにより、メモリまたはポインタに関連するバグの可能性が大幅に減少します。また、セットとベクトルの寿命を切り離します。

于 2012-11-20T23:32:19.000 に答える
0

あなたは次のようなことを試しましたか

 typedef std::shared_ptr<A> APtr

 std::set<APtr, compareClassThatTakesAPtr> aSet;
 aSet.insert(new A());

 std::vector<APtr> aVec;

 //...
 aVec.push_back(aSet.begin());

それらがヒープ上にあるので、set/vectorはAのインスタンスを直接管理していません。代わりに、あなたsetvectorすべてが同じオブジェクトを指しているという事実に責任を負います。

于 2012-11-20T23:34:59.650 に答える