迭代器错误从非标量类型转换

时间:2012-10-06 11:47:22

标签: c++ stl iterator

我必须编写一段代码来从容器std :: list中删除任何重复项。 我测试了不同的方法,但有一个产生我不理解的错误。我报错了代码:

  std::list<clock_t> cList;
  for(int i = 0;i< 5 ; ++i){
    for(int j = 0;j < 1000000 ;++j);
    cList.push_back(generatorClock()());
  }
  cList.sort();
  std::list<clock_t> cListUnique;
  std::list<clock_t>::iterator itEnd1 = **std::unique_copy(cList.begin(),cList.end(),std::back_insert_iterator<std::list<clock_t> >(cListUnique) );**

错误消息是

"error: conversion from ‘std::back_insert_iterator<std::list<long int> >’ to non-scalar type ‘std::list<long int>::iterator {aka std::_List_iterator<long int>}’ requested"

为什么我会收到此错误? 谢谢

3 个答案:

答案 0 :(得分:1)

我假设将**放在那里以指示错误产生的位置而不是实际来源的一部分。在C ++中使用**是一个糟糕的选择,因为它通常用于取消引用迭代器或指针。

也就是说,std::unique_copy()返回一个指示写序列结束的迭代器。即使std::back_insert_iterator<std::list<clock_t> >用于相同类型的列表,您正在写入与std::list<clock_t>::iterator实际上没有任何关系的std::back_insert_iterator<std::list<clock_t> >。此外,您并不真正需要它:您的cListUnique将包含相应的唯一元素序列。它与std::unique()不同,您需要使用结束迭代器来知道在哪里切断序列,例如erase()

答案 1 :(得分:0)

返回unique_copy的类型:

OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result);

OutputIterator

尝试:

std::back_insert_iterator< std::list< int > > itEnd1 = std::unique_copy( cList.begin(), cList.end(), std::back_insert_iterator< std::list< int > >( cListUnique ) );

答案 2 :(得分:0)

std::unique_copy必须返回std::back_insert_iterator

因此,您不仅应尝试使用迭代器,还应尝试使用back_insert_iterator:

std::list<clock_t>::back_insert_iterator itEnd1 = ...

错误基本上是iAn,它正在尝试将back_insert_iterator分配给迭代器。