簡體   English   中英

將 std::find() 與反向迭代器一起使用

[英]Using std::find() With Reverse Iterators

我在理解如何在std::find()函數中使用反向迭代器時遇到了一些麻煩。 我相信如果我能看到一個完成以下任務的例子,我就能完美地理解它。

所以,假設我有一個想要搜索的std::vector 但是,我不想搜索典型的方式。 我想找到從某個索引開始並朝向向量開頭的值的第一次出現。 為了顯示:

3 | 4 | 7| 4| 2| 6| 3|
    ^             ^
    |<------------| 
             start_point

搜索:在給定上述搜索布局的情況下,查找第一次出現,共 4 個

預期結果:指數 3

我很確定在這種情況下必須使用反向迭代器,但我不知道該怎么做。

如果您使用的是std::vector或任何其他提供隨機訪問迭代器的容器,您可以只使用算術來推進迭代器,就像使用指針一樣。 您的示例向量有 7 個元素,並且您希望從索引 5 開始,因此您可以使用以下命令獲得該元素的普通迭代器:

auto i = v.begin() + 5;

對於反向迭代器,您從向量的后面開始,而不是從前面開始,因此要獲得正確的偏移量,您必須從大小中減去所需的索引,如下所示:

auto i = v.rbegin() + (v.size() - 5);

在您的示例中,這將是2 ,因此反向迭代器將開始指向最后一個元素,然后向開頭移動兩個空格,到達您想要的起點。

然后,您可以以正常方式使用std::find

auto found = std::find(v.rbegin() + (v.size() - 5), v.rend(), 4);
if(found == v.rend()) {
    std::cout << "No element found." << std::endl;
} else {
    std::cout << "Index " << (v.rend() - found) << std::endl;
}

請記住,在測試std::find的結果以查看是否找到任何內容時,您需要使用rend() ,而不是end() 當您將反向迭代器與普通迭代器進行比較時,您是在比較實際位置,而不是從開始的偏移量,因此v.rend() != v.end()

如果您沒有隨機訪問迭代器(例如,在std::list ),則不能使用指針式算術,因此您可以使用std::advance將迭代器std::advance到特定位置和std::distance獲取兩個迭代器之間的距離。

首先設置起始位置:

auto it = v.rbegin() + 2;  // two from the end

然后搜索:

auto kt = std::find(it, v.rend(), 4);

如果kt == v.rend() ,則找不到元素; 否則我們可以通過簡單的距離計算從前面計算索引:

if (kt == v.rend()) {
  std::cerr << "Element 4 not found.\n";
  std::abort();
} else {
  auto n = std::distance(kt, v.rend()) - 1;
  std::cout << "Element 4 found at position v[" << n << "].\n";
}

嘗試類似以下內容

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
    std::vector<int> v = { 3, 4, 7, 4, 2, 6, 3 };
    std::vector<int>::size_type pos = 4;

    auto it = std::find(std::next(v.rbegin(), v.size() - pos), v.rend(), 4);

    if (it != v.rend())
    {
        std::cout << std::distance(v.begin(), it.base() - 1) << std::endl;
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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