0

要素がクラスであるベクトル内の要素の位置を取得するにはどうすればよいですか。これを行う方法はありますか?

コード例:

class Object
{
  public:
    void Destroy()
    {
      // run some code to get remove self from vector
    }
}

main.cpp で:

std::vector<Object> objects;
objects.push_back( <some instances of Object> );
// Some more code pushing back some more stuff

int n = 20;
objects.at(n).Destroy(); // Assuming I pushed back 20 items or more

だから私は、ベクトル内のそれ自体の位置を返すクラスのメンバーであるメソッドまたは何かを記述できるようにしたいと思います...これは可能ですか?

編集:

混乱しているため、もっと詳しく説明する必要があります。

void Destroy(std::vector<Object>& container){
  container.erase( ?...? );
}

問題は、消去を行う番号をどのように見つけることができるかということです...? どうやらこれは不可能だ...そうではないかもしれないと思った...

4

4 に答える 4

1

オブジェクトは次のように自分自身を消去できます。

void Destroy(std::vector<Object>& container);
{
  container.erase(container.begin() + (this - &container[0]));
}

これは期待どおりに機能しますが、非常に悪い設計だと思います。メンバーは、コンテナに関する知識を持っていてはなりません。それらは(独自の観点から)識別できない辺鄙なところに存在する必要があります。創造と破壊は創造者に任せるべきです。

于 2013-02-18T22:30:33.883 に答える
0

ベクター内の n 番目のアイテムを破棄する必要がある場合、最も簡単な方法は、イテレータを最初から取得しstd::begin()、呼び出しstd::advance()て必要な数の場所を進めることです。次のようになります。

std::vector<Object> objects;
const size_t n = 20;

auto erase_iter = std::advance(std::begin(objects), n);

objects.erase(erase_iter);

ベクター内のアイテムのインデックスを見つけたい場合は、を使用std::findしてイテレータを取得std::distanceし、最初から呼び出します。

次のようなものです:

Object object_to_find;
std::vector<Object> objects;

auto object_iter = std::find(std::begin(objects), std::end(objects), object_to_find);

const size_t n = std::distance(std::begin(objects), object_iter);

これは、オブジェクトに等価演算子を実装する必要があることを意味します。または、次のようなものを試すことができます。

auto object_iter = std::find(std::begin(objects), std::end(objects), 
  [&object_to_find](const Object& object) -> bool { return &object_to_find == &object; });

これが機能するためには、 object_to_find はアドレスを比較しているだけなので、実際のリストからのものである必要があります。

于 2013-02-18T22:06:24.473 に答える