2016-10-26 2 views
1

Quel est le moyen le plus correct et le plus efficace pour std :: déplacer des éléments d'un vecteur d'un certain type (T1) dans un vecteur d'une paire std :: de même type (T1) et d'un autre type (T2)? En d'autres termes, comment écrire MoveItems()?Déplacer des éléments de std :: vector <T1> vers std :: vector <std :: pair <T1,T2>>

#include <iostream> // For std::string 
#include <string> // For std::string 
#include <vector> // For std::vector 
#include <utility> // For std::pair 

using std::vector; 
using std::string; 
using std::pair; 

vector<string> DownloadedItems; 
vector<pair<string,bool>> ActiveItems; 

vector<string> Download() 
{ 
    vector<string> Items {"These","Words","Are","Usually","Downloaded"}; 
    return Items; 
} 

void MoveItems() 
{ 
    for (size_t i = 0; i < DownloadedItems.size(); ++i) 
     ActiveItems.push_back(std::pair<string,bool>(DownloadedItems.at(i),true)); 
} 

int main() 
{ 
    DownloadedItems = Download(); 
    MoveItems(); 
    return 0; 
} 

Merci pour votre temps et votre aide, j'apprécie vraiment!

Répondre

0
void MoveItems() 
{ 
    ActiveItems.reserve(DownloadedItems.size()); 
    for (auto& str : DownloadedItems) 
     ActiveItems.emplace_back(std::move(str), true); 
} 

.: N.B. Pour les chaînes aussi petites que celles de votre exemple, le déplacement peut avoir le même coût que la copie en raison de l'authentification unique, ou peut-être même un peu plus cher si la mise en œuvre décide de vider la source de toute façon.

0

Certaines choses que vous pouvez faire:

Au début de MoveItems(), appelez ActiveItems.reserve(DownloadedItems.size());. Cela empêche votre tableau de se redimensionner lorsque vous y insérez des éléments. Au lieu d'appeler push_back, appelez le emplace_back. Here est une explication des avantages de le faire.

À noter, dans cet exemple, vous pouvez arrêter la copie dans une nouvelle structure de données en construisant simplement le std::pair dès le départ, et non en copiant des données.

+0

Merci pour votre réponse. Cependant, même avec un appel à 'emplace_back', il fait une copie des chaînes d'origine. Quand je vais imprimer les valeurs de 'DownloadedItems', ils sont toujours là après l'exécution de' MoveItems() ' –

+0

Oui, mais vous ne faites pas de' std :: pair' temporaire, puis vous le copiez. Vous faites la paire sur place. – druckermanly