2010-10-24 19 views
1

J'essaie d'utiliser un back_insert_iterator avec remove_copy_if en utilisant des vecteurs mais j'ai des erreurs de compilation.back_insert_iterator avec remove_copy_if

Savez-vous pourquoi le code ci-dessous est erroné?

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <cassert> 
#include <vector> 
#include <iterator> 
#include <functional> 

struct checkRem : std::unary_function<int,bool> { 
    int _val; 
    checkRem(int val): _val(val){} 
    bool operator()(int aVal){ return aVal > _val;} 
}; 

int main(int argc, char** argv) 
{ 
int _vIn[] = {1,2,3,4,2,3,4,3,6,7}; 
std::vector<int> vIn(_vIn, _vIn + (sizeof(_vIn)/sizeof(_vIn[0]))); 

// remove with copy 
std::vector<int>vOut; 
std::back_insert_iterator< std::vector<int> > bit(vOut); 

std::vector<int>::iterator new_end = 
std::remove_copy_if(
    vIn.begin(), 
    vIn.end(), 
    bit, 
    checkRem(2) 
); 
} 
back_insrt_iter.cpp: In function ‘int main(int, char**)’: 
back_insrt_iter.cpp:30: error: conversion from  
‘std::back_insert_iterator<std::vector<int, std::allocator<int> > >’ to non-scalar 
type ‘__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >’ 
requested 
+0

Pourriez-vous coller du vrai code? Pour que nous puissions trouver l'erreur plus facile? ce que le diable est 'std :: vectorvrc;' –

+0

et WTH est 'std :: back_insert_iterator> bit (vrc);' trop :) –

+1

Pourriez-vous s'il vous plaît coller un exemple complet - avec la définition de checkFoo vr et tous les inclus? Rien ne semble se tromper ici –

Répondre

1

std::remove_copy_if() renvoie un itérateur de même type que l'itérateur de sortie. Dans ce cas, c'est un std::back_inserter_iterator. Vous ne modifiez pas le conteneur d'entrée, mais vous copiez dans un conteneur de sortie les éléments pour lesquels le prédicat ne tient pas.

En bref, utilisez std::remove_if() si vous souhaitez changer votre conteneur d'entrée.

+0

Vous avez raison! Dans ce cas précis, je viens de supprimer le code "std :: vector < int > :: iterator new_end =" afin qu'il ne renvoie aucune valeur et qu'il soit correct. Merci beaucoup! AFG –