【问题标题】:Printing the iterator that is being returned打印正在返回的迭代器
【发布时间】:2016-01-10 11:35:30
【问题描述】:

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

#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;
}

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

【问题讨论】:

  • 你在问如何取消引用迭代器?
  • 你真的应该从更简单的东西开始。这段代码中有太多错误,我们无法真正理解它的确切意图。尝试编写一个程序,在 one 向量中查找并打印一个值。并尝试先使用std::find
  • 如果在这种情况下找到元素或值,我试图查看它返回的迭代器
  • 问题出在int main()。我试图让迭代器指向a,迭代器指向b
  • 迭代器并不指向一个整体的集合。它指向单个元素或者是特殊的end()

标签: c++ templates iterator


【解决方案1】:

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

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

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

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

MyVeryFineClass exists;

std::cout << exists;

这也行不通,至少在定义我自己的在std::ostream 上运行的operator&lt;&lt; 和我的非常好的类的实例之前是行不通的。

这就是为什么你不能接受

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.

【讨论】:

  • 谢谢!我的代码可以编译,但是如何测试我的代码以打印包含值“9”的迭代器?如果你能帮助我,那么你确实帮助我更好地理解了这一点
  • 有更多的错误。最重要的是,OP 试图从两个不同的容器中提供函数迭代器。
  • @MoliswKikszsz - 如果开始和结束迭代器都来自同一个容器,则只能以尝试搜索的方式进行搜索。您修改后的代码将来自第一个容器的 begin() 迭代器和来自第二个容器的 begin() 迭代器传递给 find_elem()。那没有意义。 find_elem() 搜索开始和结束迭代器之间的序列,因此,您必须将 begin() 和 end() 从同一容器传递给它。如果 find_elem() 没有找到它要找的东西,它会返回 end(),然后你只需对第二个容器重复 find_elem()。
【解决方案2】:

请在代码内的评论部分查看我的答案。 这是您的问题的工作代码。

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

template <typename Iterator, typename T>
Iterator find_elem(Iterator &first, Iterator &last, const T obj){
    //compare the value (after dereferencing the iterator)
    //can not comapre two iterator from two different container
    while(*first != *last && (*first) != obj){
        ++first;
    }
    return first;
}

int main() {
 //insert using push_back()
  vector<int> a;
  a.push_back(3);
  a.push_back(4);
  a.push_back(5);
  a.push_back(6);
  a.push_back(7);
  vector<int>::iterator one = a.begin();

  vector<int> b;
  b.push_back(5);
  b.push_back(6);
  b.push_back(7);
  b.push_back(8);
  b.push_back(9);
  //Initialize the iterator one and two with the first value of the containers
  vector<int>::iterator two = b.begin();
  //dereference the returned iterator 
  cout << *(find_elem(one, two, 9)); // ERROR ON THIS LINE

  return 0;
}

【讨论】:

    猜你喜欢
    • 2019-04-01
    • 2018-06-15
    • 1970-01-01
    • 2020-08-29
    • 2015-10-05
    • 2021-12-25
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多