3

C++ では、ベクトルから要素を削除するにはどうすればよいですか?

  1. その場所から削除します。つまり、ベクトルのサイズを変更します。
  2. 削除する要素を最後の要素と交換 st pop_back() を使用できます(すべてをコピーする必要はありません...)

(1) については、次のことを試しましたが、本来の動作 ( removeItem() に渡されたアイテムを削除する) を行うかどうかはよくわかりませんが、あまりエレガントではないようです。

vector<Item*> items;            
// fill vector with lots of pointers to item objects (...)

void removeItem(Item * item) {
    // release item from memory
    if (int i = getItemIdIfExists(item) != -1) {
        items.erase (items.begin()+i);
    }
}

int getItemIdIfExists(Item * item) {
    // Get id of passed-in Item in collection
    for (unsigned int i=0; i<items.size(); i++) {
        // if match found
        if (items[i] == item)     return i;  
    }
    // if no match found
    return -1;
}
4

3 に答える 3

8

標準のremove+eraseイディオムは、要素を値で削除します。

#include <vector>
#include <algorithm>

std::vector<int> v;
v.erase(std::remove(v.begin(), v.end(), 12), v.end());

removeすべての消去対象が最後になるように要素を並べ替え、消去対象範囲の先頭にイテレータを返し、erase実際にコンテナーから要素を削除します。

vectorこれは、特に 1 回のウォッシュですべてが消去される同じ値の複数の要素がある場合に、 のような連続ストレージ コンテナーで得られるのと同じくらい効率的です。

于 2011-10-23T21:43:54.257 に答える
2
void removeItem(Item*item){
  for(int i=0; i<items.size(); i++){
    if (items[i]==item){
      swap(items[i], items.back());
      items.pop_back();
      return;
    }
  }
}

ただし、順序が重要でない場合は、単に ? を使用しないのはなぜstd::setですか?

于 2011-10-23T21:02:51.237 に答える
1

その場所から削除します。つまり、ベクトルのサイズを変更します。

それeraseがそうです。

削除する要素を最後の要素と交換 st pop_back() を使用できます(すべてをコピーする必要はありません...)

remove残りのオブジェクトの順序を保持するため、すべてをコピーする必要があることを除いて、これが機能します。

あなたがしたことは次のように書くことができます:

items.erase(
    std::remove(
        items.begin(), items.end()
      , item
    )
  , items.end()
);

コードとの違いは、最初のアイテムだけでなく、valuedのすべてのアイテムが実際に削除されることです。item

于 2011-10-23T20:57:31.710 に答える