gpt4 book ai didi

C++ Iterator generalize - 不同的容器,相同的类型

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:20 26 4
gpt4 key购买 nike

我知道 C++ 中没有迭代器的抽象基类,但我有一个具体问题找不到答案。在 list::begin() 的文档中给出了这个遍历列表的例子:

std::cout << "mylist contains:";
for (std::list<int>::iterator it=mylist.begin(); it != mylist.end(); ++it)
std::cout << ' ' << *it;
...

对于 list::rbegin()这是给出的:

std::cout << "mylist backwards:";
for (std::list<int>::reverse_iterator rit=mylist.rbegin(); rit!=mylist.rend(); ++rit)
std::cout << ' ' << *rit;
...

我真的必须指定迭代器是列表迭代器吗- std::list<int>::iterator ?这意味着我无法在来自不同容器的相同类型(比如 int)的迭代器之间进行概括?!此外,我真的必须区分 std::list::iterator 和 std::list::reverse_iterator 吗?根据文档,它们都是 ForwardIterators

我怎样才能避免这些资格?这似乎违背了拥有迭代器的全部意义。

最佳答案

您标记了 C++11,因此为了避免这些声明,您可以使用范围 for-loopbegin()end( ):

std::cout << "mylist contains:";
for (auto item : mylist)
std::cout << item << *it;

是的,您需要区分反向迭代器的情况,因为它们确实是另一种类型的迭代器(在 std::list 上反向,这是一个双向链表,所以你的循环的输出确实会有所不同)。

编辑:

避免为不同容器或迭代器类型编写手工循环的 STL 方法是使用将一对迭代器作为参数的通用算法:

std::for_each (mylist.begin(), mylist.end(), myfunction);

因此,您可以在任何类型的容器或迭代器中重用您的算法,而无需重写代码。这样的算法是模板,以迭代器类型为模板,允许在某些情况下提供特化(例如,使用随机迭代器比使用前向迭代器更容易执行 std::sort)。

关于C++ Iterator generalize - 不同的容器,相同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24132377/

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