簡體   English   中英

比較向量<T> ::帶有向量的迭代器<T> ::反向迭代器

[英]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指向的元素之后的元素。

結帳http://en.cppreference.com/w/cpp/iterator/reverse_iterator/base

rit.base()

返回一個“普通”迭代器。

您可以使用(&*start == &*(end - 1))直接比較迭代器指向的地址。

這兩種類型無法進行比較(這是一個非常好的主意)並且在我看來調用.base()不是很優雅(或通用)。 您可以轉換類型並比較結果。 考慮到涉及reverse_iterators的一對一規則。

iteratorreverse_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM