Copy std::map into std::vector of pairs

后端 未结 3 1393
时光取名叫无心
时光取名叫无心 2021-01-17 08:34

I\'m trying to copy a map into a vector of pair, so I can then sort the vector by the second data member of the pairs. I have resolved this doing like this:

相关标签:
3条回答
  • 2021-01-17 08:43

    Just use std::vector's assign member function.

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

    If you have existing values in the vector that you don't want overwritten then use insert instead like

    vectorWordsList.reserve(vectorWordsList.size() + mappedWordsList.size()); // make sure we only have a single memory allocation
    vectorWordsList.insert(vectorWordsList.end(), mappedWordsList.begin(), mappedWordsList.end());
    
    0 讨论(0)
  • 2021-01-17 08:51

    It's worth noting that if you are creating a vector for this purpose, you may use the vector's constructor directly:

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

    In C++17, you may also omit the vector's template arguments to have the compiler deduce them:

    std::vector vectorWordsList( mappedWordsList.begin(), mappedWordsList.end() );
    
    0 讨论(0)
  • 2021-01-17 08:57

    You can use std::copy and std::back_inserter:

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

    Honestly, I think that a range-for loop is clearer:

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

    Regardless, you can use std::vector::reserve to preallocate memory on your target vector, avoiding unnecessary reallocations.

    0 讨论(0)
提交回复
热议问题