17

ベクトルイテレータから開始イテレータを減算することにより、インデックスを取得する方法を知っています。例えば:

vector<int>::iterator it = find(vec.begin(), vec.end(), x);
size_t position = it - vec.begin();

xしかし、今はベクトルの最後のインデックスを見つけたいと思っています。逆イテレータから実際のインデックスを取得するにはどうすればよいですか? うまくいくように見える次のことを見つけました(編集:そうではありません)が、より良い(より慣用的な方法など)方法があるかもしれません。

vector<int>::reverse_iterator it = find(vec.rbegin(), vec.rend(), x);
size_t position = vec.size() - (it - vec.rbegin());
4

3 に答える 3

17

私は使うだろう:

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    auto v = std::vector<int> { 1, 2, 3 };
    auto rit = std::find(v.rbegin(), v.rend(), 3);
    if (rit != v.rend()) {
        auto idx = std::distance(begin(v), rit.base()) - 1;
        std::cout << idx;
    } else
        std::cout << "not found!";
}

ライブの例

-1in the distance 計算の理由は、.base()メンバー内の逆反復子と通常の反復子の間の変換のためです。

24.5.1 逆反復子 [reverse.iterators]

1 クラス テンプレート reverse_iterator は、基になる反復子によって定義されたシーケンスの末尾からそのシーケンスの先頭まで反復する反復子アダプターです。逆反復子とそれに対応する反復子 i の間の基本的な関係は、次の恒等式によって確立されます&*(reverse_iterator(i)) == &*(i - 1)

: のチェックなしで上記のコードを使用し、見つからない要素と同等v.rend()の規則を使用することもできます。idx == -1ただし、それは実行する能力を失うv[idx]ため、最終的にはそれに対するチェックも必要になります。

于 2014-07-28T14:55:38.687 に答える
5

あなたが使用することができます:

container.size() - 1 - (iterator - container.rbegin())

また

container.size() - 1 - std::distance(container.rbegin(), iterator)

逆反復子の詳細。混乱せずに逆イテレータを使用する方法。逆方向イテレータを順方向イテレータなどに変換する。

于 2014-07-28T14:55:08.857 に答える
4

TemplateRex の回答を変更して、逆イテレータのみを使用するようにします。これにより、逆順変換による頭痛を回避できます。

int main()
{
    auto v = std::vector<int> { 1, 2, 3 };
    auto rit = std::find(v.rbegin(), v.rend(), 3);
    if (rit != v.rend()) {
        auto idx = std::distance(rit, v.rend()) - 1;
        std::cout << idx;
    } else
        std::cout << "not found!";
}

-1ベクトル (インデックス 0) の最初の要素が実際には にあるため、 はまだ必要ですv.rend() - 1

于 2020-11-17T20:50:32.380 に答える