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

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

Barbara Streisand
發布: 2024-12-31 02:09:11
原創
847 人瀏覽過

How Can I Get Element Indices in C   Range-Based For Loops?

在基於範圍的 For 循環中尋找元素位置

在程式設計中,經常需要確定被迭代元素的索引或位置超過。使用基於範圍的 for 迴圈(它提供了一種方便的方法來迭代容器)時,會出現問題:是否可以在不使用單獨的迭代器的情況下檢索當前元素的索引。

1。拉鍊技術

一種方法涉及使用一種稱為拉鍊的技術。這涉及到將容器與索引結合起來,創建一個新的對範圍,其中每對由索引和相應的元素組成。

struct Indexer {
  class iterator {
    iterator(typename T::iterator it): _pos(0), _it(it) {}
    std::pair<size_t, typename T::reference> operator*() const { return std::make_pair(_pos, *_it); }
    // ...
  };
  iterator begin() const { return iterator(_container.begin()); }
  iterator end() const { return iterator(_container.end()); }
private:
  T& _container;
};
登入後複製

透過使用 Indexer 類,可以進行迭代遍歷容器並同時取得索引和元素。

2. Boost.Range

另一個選項涉及利用 Boost.Range 庫。具體來說, boost::adaptors::indexed 適配器可用於建立派生範圍,其中包括每次迭代的索引和元素。

std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9};
for (auto const& [idx, elem]: boost::adaptors::indexed(v)) {
  std::cout << idx << ": " << elem << "\n";
}
登入後複製

透過迭代從 boost 獲得的結果範圍: :adaptors::indexed,可以在for循環中存取索引和元素。

3.自訂迭代器

在某些情況下,可能需要建立一個維護目前索引的自訂迭代器。此迭代器可以與基於範圍的 for 迴圈結合使用來存取索引和元素。

class IndexedIterator {
private:
  container_type* _container;
  size_t _index;
public:
  IndexedIterator(container_type* c) : _container(c), _index(0) {}
  bool operator!=(const IndexedIterator& other) const { return _container != other._container || _index != other._index; }
  std::pair<size_t, value_type> operator*() const { return std::make_pair(_index, *_container[_index]); }
  IndexedIterator& operator++() { _index++; return *this; }
};
登入後複製

透過定義自訂迭代器並使其適應容器的迭代器類型,可以獲得元素及其索引直接在 for 迴圈中。

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

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