1

我必须编写一段代码来从容器 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"

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

4

3 回答 3

2

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

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

于 2012-10-06T12:13:28.607 回答
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 ) );
于 2012-10-06T12:13:15.567 回答
0

std::unique_copy必须回来std::back_insert_iterator

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

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

该错误基本上是它试图将 back_insert_iterator 分配给迭代器的 iAn。

于 2019-09-16T22:26:50.510 回答