首頁 > 後端開發 > C++ > 如何在基於 C 範圍的 For 迴圈中取得元素的索引?

如何在基於 C 範圍的 For 迴圈中取得元素的索引?

Patricia Arquette
發布: 2024-12-09 17:12:10
原創
267 人瀏覽過

How to Get the Index of an Element in a C   Range-Based For Loop?

如何在基於範圍的for 循環中確定物件的索引

在基於範圍的for 循環中,通常會出現以下情況:希望存取容器內目前元素的索引。考慮以下程式碼:

vector<int> list;
for (auto& elem : list) {
    int i = elem;
}
登入後複製

在這種情況下,您可能想知道 elem 在列表向量中的位置,而不需要維護單獨的迭代器。

基於 Zipper 的方法

為了實現這一點,可以採用「拉鍊」方法。您可以使用索引對其進行“壓縮”,而不是直接在容器上進行迭代。

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 {
    public:
        typedef std::pair<size_t, typename iterator_extractor<T>::type::reference> reference;

        iterator(typename iterator_extractor<T>::type 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==(const iterator& it) const { return _it == it._it; }
        bool operator!=(const iterator& it) const { return !(*this == it); }

    private:
        size_t _pos;
        typename iterator_extractor<T>::type _it;
    };

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

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

private:
    T& _container;
};

template <typename T>
Indexer<T>& index(T& t) { return Indexer<T>(t); }
登入後複製

此程式碼建立一個 Indexer 類,該類別提供一個迭代器,該迭代器將元素及其索引組合成一對。透過使用此索引器,您可以同時存取索引和元素。

使用範例

以下程式碼示範如何使用拉鍊方法:

#include <iostream>
#include <vector>

using namespace std;

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

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

    return 0;
}
登入後複製

此程式碼將以以下格式列印索引和元素值:

0: 1
1: 2
2: 3
3: 4
4: 5
5: 6
6: 7
7: 8
8: 9
登入後複製

以上是如何在基於 C 範圍的 For 迴圈中取得元素的索引?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板