ホームページ >バックエンド開発 >C++ >C で範囲ベースの for ループを使用してベクトルを反復処理しているときに要素のインデックスを取得するにはどうすればよいですか?

C で範囲ベースの for ループを使用してベクトルを反復処理しているときに要素のインデックスを取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 03:18:11930ブラウズ

How can I get the index of an element while iterating through a vector using a range-based for loop in C  ?

範囲ベースの For ループを使用したインデックス抽出

C プログラミングでは、範囲ベースの for ループは要素を反復する簡潔な方法を提供しますコンテナの。ただし、追加の反復子に依存せずに反復中に現在の要素のインデックスを決定することが必要になる場合があります。

問題:

値のベクトルが与えられ、以下に示す範囲ベースの for ループ:

vector<int> list;
for(auto& elem:list) {
    int i = elem;
}

メンテナンスせずにベクトル内の要素の位置を見つける方法はありますか?別のイテレータ?

解決策:

はい、範囲ベースの for ループを繰り返しながらインデックスを抽出することができます。この手法には、テンプレート化された構造と反復子の組み合わせが含まれます。

template <typename T>
struct iterator_extractor { typedef typename T::iterator type; };

template <typename T>
struct iterator_extractor<T const&> { typedef typename T::const_iterator type; };

template <typename T>
class Indexer {
public:
    class iterator {
        typedef typename iterator_extractor<T>::type inner_iterator;
        typedef typename std::iterator_traits<inner_iterator>::reference inner_reference;
    public:
        typedef std::pair<size_t, inner_reference&> reference;

        iterator(inner_iterator it): _pos(0), _it(it) {}

        reference operator*() const { return reference(_pos, *_it); }

        iterator& operator++() { ++_pos; ++_it; return *this; }
        iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }

        bool operator==(iterator const& it) const { return _it == it._it; }
        bool operator!=(iterator const& it) const { return !(*this == it); }

    private:
        size_t _pos;
        inner_iterator _it;
    };

    Indexer(T& t): _container(t) {}

    iterator begin() const { return iterator(_container.begin()); }
    iterator end() const { return iterator(_container.end()); }

private:
    T& _container;
}; // class Indexer

template <typename T>
Indexer<T> index(T& t) { return Indexer<T>(t); }

このコード スニペットは、インデックスと値を同時にキャプチャしながらコンテナーを反復処理する機能を提供します。 Indexer クラスはコンテナをラップし、インデックスと要素参照のペアを生成するカスタム イテレータを提供します。

使用例:

範囲内で Indexer クラスを使用するには、- for ループに基づいて、次の操作を行うことができます。

#include <iostream>
#include <limits>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9};

    for (auto p: index(v)) {
        std::cout << p.first << ": " << p.second << "\n";
    }
}

この例では、ループは、ベクトルとそのインデックス:

0: 1
1: 2
2: 3
3: 4
4: 5
5: 6
6: 7
7: 8
8: 9

以上がC で範囲ベースの for ループを使用してベクトルを反復処理しているときに要素のインデックスを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。