2012-10-06 2 views
1

Je dois écrire un morceau de code pour supprimer les doublons d'un conteneur std :: list. J'ai tester différentes méthodes mais une erreur produit que je ne comprends pas. Je signale le mauvais code:Conversion d'erreur Iterator de type non scalaire

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

Le message d'erreur est

"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" 

Pourquoi puis-je obtenir cette erreur? Merci

Répondre

0

Retour type de unique_copy:

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

est OutputIterator.

Essayez:

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

Je suppose que les ** sont mis là pour indiquer où l'erreur est produit plutôt que de faire partie de la source réelle. Utiliser ** est un mauvais choix en C++ car il sert normalement à déréférencer un itérateur ou un pointeur.

Cela dit, std::unique_copy() renvoie un itérateur indiquant la fin de la séquence d'écriture. Vous écrivez à un std::back_insert_iterator<std::list<clock_t> > qui n'a pas vraiment de relation avec un std::list<clock_t>::iterator même si le std::back_insert_iterator<std::list<clock_t> > est pour une liste du même type. De plus, vous n'en avez pas vraiment besoin: votre cListUnique contiendra la séquence correspondante d'éléments uniques. Ce n'est pas comme std::unique() où vous avez besoin de l'itérateur de fin pour savoir où couper la séquence en utilisant, par exemple, erase().

Questions connexes