gpt4 book ai didi

c++ STL base() 做了什么

转载 作者:IT老高 更新时间:2023-10-28 21:54:58 25 4
gpt4 key购买 nike

我有这样的代码:

vector <int> v;
for (int i=0; i<5; i++)
v.push_back(i);
v.erase(find(v.rbegin(), v.rend(),2).base());

此代码在第一次检测到 2 后从 vector v 中删除第一个元素(在 vector 中剩余:0 1 2 4)。.base() 在这里做什么?

最佳答案

base() 将反向迭代器转换为相应的正向迭代器。然而,尽管它很简单,但这种对应并不像一件可能的事情那么简单。

当反向迭代器指向一个元素时,它会取消对前一个元素的引用,因此它物理上指向的元素和它逻辑上指向的元素是不同的。在下图中,i 是正向迭代器,ri 是由 i 构造的反向迭代器:

                             i, *i
|
- 0 1 2 3 4 -
| |
*ri ri

所以如果ri逻辑上指向元素2,它物理上指向元素3。因此,当转换为前向迭代器时,生成的迭代器将指向元素 3,这是在您的示例中被删除的元素。

以下小程序演示了上述行为:

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

int main(int argc, char *argv[])
{
std::vector<int> v { 0, 1, 2, 3, 4 };
auto i = find(begin(v), end(v), 2);

std::cout << *i << std::endl; // PRINTS 2

std::reverse_iterator<decltype(i)> ri(i);
std::cout << *ri << std::endl; // PRINTS 1
}

这里是 live example .

关于c++ STL base() 做了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16609041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com