2017-07-11 7 views
0

Je rencontre des problèmes pour trouver plusieurs éléments du même élément dans un vecteur. Je voudrais trouver des éléments en double tous les 3 index. S'il y a un doublon, les 2 éléments suivants vont dans un nouveau vecteur.Comment trouver plusieurs éléments dans un fichier std :: vector

std::vector<std::wstring> wsBuf = {"one" , "three", "five", "two", "one","ten", "nine"};` 
std::vector<std::wstring> wsWriteFile; 
for(DWORD i = 0; i < wsBuf.size(); ++i) 
{ 
    std::vector<std::wstring>::iterator it = wsReadFile.begin(); //wsReadFile has an enumerated list 
    it = std::find(it, wsReadFile.end(), wsBuf[i]); 
    if(it != wsReadFile.end()) 
    { 
    DWORD index = std::distance(wsReadFile.begin(), it); 
    if(index < wsReadFile.size()) 
    { 
     wsWriteFile.push_back(wsReadFile[index]; 
     wsWriteFile.push_back(wsReadFile[index + 1]; 
     wsWriteFile.push_back(wsReadFile[index + 2]; 
    } 
    } 
} 

Ceci ne trouvera que l'index zéro mais pas le second. Est-ce que quelqu'un a une idée de comment trouver le second index avec les fonctions C++ 11?

je trouve un moyen de le faire sans C++ 11 fonctions

`for(DWORD i = 0; i < wsBuf.size(); ++i) 
{ 
    DWORD j = 0; 
    do 
    { 
    if(wsBuf[i] == wsReadFile[j]) 
    { 
     wsWriteFile.push_back(wsReadFile[index]; 
     wsWriteFile.push_back(wsReadFile[index + 1]; 
     wsWriteFile.push_back(wsReadFile[index + 2]; 
    } 
    j+=3; 
    }while(j < wsReadFile.size()); 
}` 
+3

Si vous voulez supprimer les doublons * *, puis 'std :: sort' le vecteur puis [std :: uniques] (http://en.cppreference.com/w/cpp/algorithm/unique) avez-vous couvert. Mais ce n'est pas tout à fait clair à partir de votre question * exactement * ce que vous voulez faire. –

+0

Copie possible de [comment trouver des doublons dans std :: vector et renvoyer une liste d'entre eux?] (Https://stackoverflow.com/questions/17892896/how-to-find-duplicates-in-stdvectorstring-and- return-a-list-of-them) – Ron

+0

@JesperJuhl désolé pour la confusion que j'ai édité ma réponse –

Répondre

0

Pour chaque wsBuf, vous n'appelez find fois. Cela trouve clairement ... un élément.

it = std::find(it, wsReadFile.end(), wsBuf[i]); 
if(it != wsReadFile.end()) 
{ 
    DWORD index = std::distance(wsReadFile.begin(), it); 
    if(index < wsReadFile.size()) 
    { 
    wsWriteFile.push_back(wsReadFile[index]; 
    wsWriteFile.push_back(wsReadFile[index + 1]; 
    wsWriteFile.push_back(wsReadFile[index + 2]; 
    } 
} 

Il ne compile pas, il vous manque quelques ) s. À l'avenir, code postal qui compile et démontre le problème; Si vous ne connaissez pas le problème, vous ne pouvez pas savoir ce qui n'a pas d'importance pour le résoudre.

Dans tous les cas, vous avez besoin d'une boucle. Je voudrais aussi vérifier les limites. Et moins itérateur < -> conversion d'index. Et moins de types qui n'ont pas d'importance.

auto it = std::find(wsReadFile.begin(), wsReadFile.end(), wsBuf[i]); 
while(it != wsReadFile.end()) 
{ 
    auto left = std::distance(it, wsReadFile.end()); 
    // don't copy past the end: 
    auto copy_end = it+(std::min)(left, decltype(left)(3)); 
    std::copy(it, copy_end, std::back_inserter(wsWriteFile)); 
    // find next: 
    it = std::find(copy_end, wsReadFile.end(), wsBuf[i]); 
}