2012-10-06 82 views
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" 

爲什麼我得到這個錯誤? 謝謝

回答

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)); 
1

我假設**都放在那裏,以指示時產生的錯誤,而不是實際的源的一部分。在C++中使用**是不好的選擇,因爲它通常用於取消引用迭代器或指針。

也就是說,std::unique_copy()返回一個指示寫入序列結束的迭代器。您正在寫信給std::back_insert_iterator<std::list<clock_t> >,即使std::back_insert_iterator<std::list<clock_t> >用於相同類型的列表,該std::back_insert_iterator<std::list<clock_t> >std::list<clock_t>::iterator沒有任何關係。此外,您並不需要它:您的cListUnique將包含相應的唯一元素序列。它不像std::unique()那裏你需要結束迭代器知道在哪裏切斷序列,例如使用erase()

相關問題