對于這段代碼:
std::vector<int> vec{0, 1, 2, 3, 4, 5, 6, 7};
std::cout << (vec.begin() 4)[2] << " \n"; // prints out 6
std::cout << (vec.begin() 4)[-1] << "\n"; // prints out 3
它按預期輸出 6 和 3。
我檢查了 cppreference,但找不到 的定義std::vector::iterator::operator[],所以我想知道這是否是實際定義的行為。
我檢查了頭檔案vector并將其跟蹤bits/stl_vector.h到bits/stl_iterator.h. 我的編譯器版本是g -11 (Ubuntu 11.1.0-1ubuntu1~20.04) 11.1.0
很明顯,在bits/stl_iterator.h迭代器的元素 ( _M_current) 中是一個T*(請參閱迭代器的 typedef in bits/stl_vector.h)。所以負索引作為指標運算是有意義的。但是是否定義了型別iterator必須模仿 a T*,這樣隨機訪問迭代器的所有算術運算都必須與指標兼容?
另外,是T*::operator[]用C 定義的嗎?我在哪里可以找到它的定義?
uj5u.com熱心網友回復:
std::vector<T>::iterator是一個Cpp17RandomAccessIterator,對于迭代器a,它的a[n]作業原理是*(a n).
和“ T*::operator[]”稱為“內置下標運算子”,在選擇后,該操作員與之pointer[index]相同*((pointer) (index))。它在這里定義,立即滿足Cpp17RandomAccessIterator的要求。
出于多載決議的目的,它具有簽名T& operator[](T*, std::ptrdiff_t)(盡管索引實際上并未轉換為std::ptrdiff_t)。這是一個內置宣告,因此將位于編譯器本身的某個位置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/537131.html
標籤:C 指针stl迭代器
上一篇:BOOST_FUSION_ADAPT_STRUCT使用帶有std::vector<self_type>成員的遞回結構
