sort pairs c++ stdvector stdmap c++-standard-library std-pair

pairs - vector c++



Copiar std:: map into std:: vector of pairs (3)

Estoy tratando de copiar un mapa en un vector de par, para poder ordenar el vector por el second miembro de datos de los pares. He resuelto esto haciendo así:

void mappedWordsListSorter(){ for (auto itr = mappedWordsList.begin(); itr != mappedWordsList.end(); ++itr){ vectorWordsList.push_back(*itr); } sort(vectorWordsList.begin(), vectorWordsList.end(), [=](pair<string, int>& a, pair<string, int>& b){return a.second > b.second;}); }

Necesito encontrar una manera de hacer esto sin usar un bucle sin procesar, usando la biblioteca estándar en su lugar. He encontrado muchos ejemplos al hacer esto solo transfiriendo las claves o los valores del mapa. Necesito copiar en un vector de pairs<string, int> . ¿Cuál es la mejor manera de hacerlo?


Puedes usar std::copy y std::back_inserter :

std::copy(mappedWordsList.begin(), mappedWordsList.end(), std::back_inserter(vectorWordsList));

Honestamente, creo que un bucle de rango for es más claro:

for(const auto& kv : mappedWordsList) vectorWordsList.emplace_back(kv);

Independientemente, puede usar std::vector::reserve para preasignar la memoria en su vector objetivo, evitando reasignaciones innecesarias.


Simplemente use la función miembro std::vector ''s assign .

//no need to call reserve, bidirectional iterators or better will compute the size and reserve internally. vectorWordsList.assign(mappedWordsList.begin(), mappedWordsList.end());

Si tiene valores en el vector que no desea que se sobrescriban, utilice en su lugar insert como

vectorWordsList.reserve(vectorWordsList.size() + mappedWordsList.size()); // make sure we only have a single memory allocation vectorWordsList.insert(vectorWordsList.end(), mappedWordsList.begin(), mappedWordsList.end());


Vale la pena señalar que si está creando un vector para este propósito , puede usar el constructor del vector directamente:

std::vector<std::pair<FirstType,SecondType>> vectorWordsList( mappedWordsList.begin(), mappedWordsList.end() );

En C ++ 17, también puede omitir los argumentos de la plantilla del vector para que el compilador los deduzca:

std::vector vectorWordsList( mappedWordsList.begin(), mappedWordsList.end() );