gpt4 book ai didi

c++ - 打印返回的迭代器

转载 作者:行者123 更新时间:2023-11-28 02:13:51 25 4
gpt4 key购买 nike

我在尝试打印出返回的迭代器时遇到了一些困难。我正在尝试创建两个具有某些值的迭代器,然后返回遇到该值的迭代器。这是我的代码:

#include <iostream>
#include <vector>
using namespace std;

template <typename Iterator, typename T>
Iterator find_elem(Iterator &first, Iterator &last, const T &obj){
while(first != last && (*first) != obj){
++first;
}
return first;
}

int main() {
vector<int>::iterator one;
vector<int> a = {3,4,5,6,7};
vector<int>::iterator two;
vector<int> b = {5,6,7,8,9};
cout << find_elem(one, two, 9); // ERROR ON THIS LINE

return 0;
}

如果有人能帮助解决这个问题,我将不胜感激,因为这将更好地帮助我详细了解迭代器

最佳答案

虽然确实迭代器没有被初始化,这是bug,但这不是编译错误的原因。

编译错误是由于误解造成的。您希望能够将迭代器“打印”到 std::cout就像任何其他指针一样。

问题是迭代器不是指针。这是一个独立的类。你不能打印一个迭代器,就像你不能打印一个任意类的实例一样。这也不起作用,例如:

class MyVeryFineClass {
public:
MyVeryFineClass() {}
};

MyVeryFineClass exists;

std::cout << exists;

这也行不通,至少在定义我自己的 operator<< 之前行不通在 std::ostream 上运行,以及我非常优秀的类(class)的一个实例。

这就是为什么你不能拿

std::vector<int>::iterator p;

并期望它起作用:

std::cout << p;

因为迭代器不是指针,而是一个std::ostream对此一无所知,当然不会比任何其他任意类更多。

对于大多数迭代器,您可以这样做:

std::cout << &*p;

通过取消对迭代器的引用,您可以获得其内容的左值,并且其地址通常可以“打印”为 std::ostream .因此,在您的情况下,它将是:

cout << &*find_elem(one, two, 9); // No more errors on this line.

关于c++ - 打印返回的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34704894/

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