3

std::vector::erase()逆イテレータを受け入れません。
このメソッドを逆イテレータで呼び出す方法はありますか?

私のサンプルコードは次のとおりです。

std::vector<int> MyVector;
for (int i=0; i<10; i++)
{
    MyVector.push_back(i);
}
// Now suppose that I want to erase the last three elements
int nEraseCount = 0;
for (std::vector<int>::const_reverse_iterator it=MyVector.rbegin();
        it<MyVector.rend(); ++it)
{
    MyVector.erase(it);
    if (++nEraseCount == 3) break;
}

ただし、itは逆イテレータでありerase()、引数として逆イテレータを使用しないため、このサンプルコードは機能していません。

このコードを変更して機能させるにはどうすればよいですか?

4

5 に答える 5

7

base()を使用してreverse_iteratorsからイテレータに変換できますが、同じ要素を指すものを取得するには1を引く必要があるため、rbegin()はend()を指し、rend()はbegin()を指します(そうではないため)実際には、開始前に1つを指すことができます)。

非constに変換できないconst_reverse_iteratorを使用していて、消去には非constイテレータが必要なため、さらに問題が発生します。ロジックは、コレクションを変更しているため、非定数イテレーターを使用することです。

あなたの場合、イテレータを削除して無効にし、前の要素に戻ろうとするため、ループに大きな問題があります。

最後の3つの要素を削除する必要がある場合は、一度に1つずつ削除するのではなく、範囲を取得する消去方法を使用する必要があります。

これはMyVector.erase(MyVector.rbegin() + 3).base(), MyVector.end() )、あなたがそれを知っている限り、この特定の場合を使用して行うことができますMyVector.size() >= 3

于 2011-01-07T12:20:43.947 に答える
5

逆イテレータを使用しないことで問題を回避します。私はおそらくそのようなものを書くでしょう:

std::vector<int> MyVector;
for (int i=0; i<10; i++)
{
    MyVector.push_back(i);
}
// Now suppose that I want to erase the last three elements
int nEraseCount = 0;
while (nEraseCount < 3 && !MyVector.empty())
{
    MyVector.pop_back();
    ++nEraseCount;
}
于 2011-01-07T12:30:54.917 に答える
4

さて、あなたにはいくつかのオプションがあります-あなたは最後から消去しています-それであなたは次のことができます:

resize()

if (MyVector.size() > 3)
  MyVector.resize(MyVector.size() - 3);
else
  MyVector.clear(); // presumably you don't want all anyway!

単純な違い

if (MyVector.size() > 3)
  MyVector.erase(MyVector.end() - 3, MyVector.end());
else
  MyVector.clear(); // presumably you don't want all anyway!

あなたが取ったアプローチはあまり慣用的ではありません

于 2011-01-07T12:46:09.637 に答える
3

後ろのN個の要素を削除したいだけの場合:

size_t N = 3;
size_t to_remove = std::min(vec.size(), N);
vec.erase(vec.end() - to_remove, vec.end());
于 2011-01-07T12:46:02.293 に答える
1

読み取り専用のイテレータであるため、const_iteratorまたはconst_reverse_iteratorに渡すことはできません。erase()

非constフォワードイテレータバージョンを使用する必要があります:std::vector<int>::iterator

于 2011-01-07T12:16:43.853 に答える