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

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

Barbara Streisand
發布: 2024-11-29 07:43:09
原創
810 人瀏覽過

How Can I Get the Index of the Current Element in a C   Range-Based For Loop?

在基於範圍的For 循環中查找當前物件的索引

在基於範圍的for 循環中,迭代容器直接提供對每個元素的訪問,而不需要顯式迭代器。然而,可能會出現這樣的情況:需要確定循環中當前元素的索引而不依賴單獨的迭代器。本題探討了一種使用組合和專門的拉鍊技術來實現這一目標的方法。

拉鍊技術

這種方法的關鍵在於用一路上的索引。拉鍊類別旨在建立類似迭代器的對象,該對象提供對容器中元素的索引和值的存取。此拉鍊有效地充當原始容器迭代器的包裝器。

實作

提供的C 程式碼示範了此技術:

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&amp; operator++() { ++_pos; ++_it; return *this; }
        iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }

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

    private:
        size_t _pos;
        inner_iterator _it;
    };

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

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

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

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

This程式碼定義了一個Indexer 類,它為給定的容器T 建立一個索引迭代器。迭代器類別提供包含索引的對的參考和元素的值。 index 函數傳回一個 Indexer 對象,可在基於範圍的 for 迴圈中使用該物件來存取索引和值。

用法

使用此技術,只需使用索引函數將向量壓縮為一系列整數:

#include <iostream>
#include <iterator>
#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";
    }
}
登入後複製

在此範例中,索引p 變數迭代向量v 的元素,提供對索引和值的存取。然後您可以在循環中輕鬆存取這些值。

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

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