2016-10-26 1 views
1

Was ist der korrekteste und effizienteste Weg, um std :: Elemente aus einem Vektor eines bestimmten Typs (T1) in einen Vektor zu verschieben eines std :: Paares desselben Typs (T1) und eines anderen Typs (T2)?Elemente von std :: vector <T1> nach std :: vector <std :: pair verschieben <T1,T2>>

Mit anderen Worten, wie sollte ich MoveItems() schreiben?

#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; 
} 

Vielen Dank für Ihre Zeit und Hilfe, ich schätze es wirklich!

Antwort

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

N. B .: Für Strings so klein wie die in Ihrem Beispiel kann das Bewegen der gleichen Kosten wie Kopieren haben aufgrund SSO oder vielleicht sogar etwas teurer, wenn die Implementierung entscheidet ohnehin die Quelle zu leeren.

0

Einige Dinge, die Sie tun können:

Zu Beginn des MoveItems(), rufen ActiveItems.reserve(DownloadedItems.size());. Dies verhindert, dass Ihr Array die Größe ändert, während Sie Dinge hineinschieben.

Statt push_back anrufen emplace_back anrufen. Here ist eine Erklärung der Vorteile, dies zu tun.

In diesem Beispiel können Sie die Kopie in eine neue Datenstruktur stoppen, indem Sie einfach std::pair von Anfang an erstellen und keine Daten kopieren.

+0

Vielen Dank für Ihre Antwort. Aber selbst mit einem Aufruf von 'emplace_back' wird eine Kopie der ursprünglichen Zeichenfolgen erstellt. Wenn ich die 'DownloadedItems'-Werte ausdrucke, sind sie nach der Ausführung von 'MoveItems()' immer noch da. –

+0

Ja, aber du machst kein temporäres 'std :: pair' und kopierst es dann zurück. Du machst das Paar an Ort und Stelle. – druckermanly

Verwandte Themen