ベクタークラスのメンバー関数を変更したいと思います。これは可能ですか?たとえば、ベクトルの整数ではなく、値に関して削除できるようにしたいと思います。
1 に答える
2
これはあなたが探しているものだと思います。この例では、 を使用してベクトルから数値 6 の出現をすべて削除しstd::removeます。xs.eraseベクトルが要素を削除し、ベクトルを新しいサイズに縮小することを確認することです。
STL コンテナを実装した人は、この種のことに関しては私よりもはるかに賢い可能性が高いため、私は通常、STL コンテナを変更することを避けています。標準ライブラリ アルゴリズムを学習することをお勧めします。通常、ほとんどの種類の一般的なコンテナ操作に適したものがあります。
#include <iostream>
#include <algorithm>
int main(int argc, char** argv)
{
std::vector<int> xs{1, 3, 6, 2, 6, 5};
std::cout << "xs size: " << xs.size() << std::endl; // xs.size() == 6
auto value_to_remove = 6;
xs.erase(std::remove(xs.begin(), xs.end(), value_to_remove), xs.end());
for (const auto& x : xs)
std::cout << x << ", ";
std::cout << std::endl; // 1, 3, 2, 5,
std::cout << "xs size: " << xs.size() << std::endl; // xs.size() == 4
return 0;
}
この場合、他のほとんどの STL アルゴリズムと同様value_to_removeに、(単項) ラムダ述語に置き換えることができ、エキゾチックな値検索の全世界が開かれます。
上記を次のように関数でラップできます。
template <typename T>
void erase_by_value(std::vector<T>& xs, const T& value_to_remove)
{
xs.erase(std::remove(xs.begin(), xs.end(), value_to_remove), xs.end());
}
于 2015-04-16T11:16:00.457 に答える