[英]Why is it not possible to remove elements from a std::map using reverse iterators?
[英]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.