[英]Compare vector<T>::iterator with vector<T>::reverse_iterator
我正在做一個練習,我有一個向量,我正在編寫我自己的反向算法,使用反向和正常(正向)迭代器來反轉向量的內容。 但是,我無法比較迭代器。
int vals[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
vector<int> numbers(vals, vals + 10);
vector<int>::iterator start = numbers.begin();
vector<int>::reverse_iterator end = numbers.rend();
我有一個以前的算法,用於通過使用兩個迭代器來反轉向量,但是在此任務中,我無法使用它們之間的 != 運算符來比較它們。 我的猜測是獲取向量中的底層指針或索引,但如何獲取指針/索引?
使用base()
返回的迭代器進行比較: it == rit.base() - 1
。
您可以通過調用base()
將reverse_iterator
轉換為iterator
。
但是要小心,因為有一些警告。 @Matthieu M. 的評論特別有幫助:
注意:
base()
實際上返回一個iterator
,指向reverse_iterator
指向的元素之后的元素。
您可以使用(&*start == &*(end - 1))
直接比較迭代器指向的地址。
這兩種類型無法進行比較(這是一個非常好的主意)並且在我看來調用.base()
不是很優雅(或通用)。 您可以轉換類型並比較結果。 考慮到涉及reverse_iterators
的一對一規則。
從iterator
到reverse_iterator
轉換需要是顯式的(幸運的是),但是,從 reverse_iterator 到 iterator 的轉換是不可能的(不幸的是)。 所以只有一種方法可以進行轉換然后進行比較。
std::vector<double> vv = {1.,2.,3.};
auto it = vv.begin();
auto rit = vv.rend();
// assert( it == rit ); // error: does not compile
assert(std::vector<double>::reverse_iterator{it} == rit);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.