Перемещение значений std :: unordered_map в std :: vector - PullRequest
0 голосов
/ 12 ноября 2018

Есть ли способ переместить unordered_map значения в вектор? Все способы, которыми я смог найти значения копирования (как в моем примере) вместо использования чего-то похожего на std::move.

Я бы не хотел копировать значения, чтобы сохранить уникальность shared_ptr foo, которую позже я изменю на unique_ptr.

class Class {
    public:
        std::shared_ptr <int> foo = std::shared_ptr <int> (new int (5));
};

int main() {
    std::unordered_map <int, Class> mapOfObjects({
                                                  {1, Class()},
                                                  {2, Class()},
                                                  {3, Class()},
                                                  {4, Class()},
                                                  {5, Class()} }); 
    std::vector <Class> someVector;

    for (auto &object : mapOfObjects) {

        someVector.push_back(object.second);
        std::cout << "Is unique?  " << ( someVector.back().foo.unique() ? "Yes." : "No.")                    
            << std::endl << std::endl;
    }  
}

Заранее благодарим за все полезные ответы.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

@ ответ SergeyA уже охватывает существенную часть, позвольте мне, тем не менее, добавить решение на основе range-v3 , оно показывает, куда направляется одна часть языка с C++ 20.

#include <range/v3/view/map.hpp>
#include <range/v3/view/move.hpp>

using namespace ranges;

/* Setup mapOfObjects... */

const std::vector<Class> someVector = mapOfObjects | view::values | view::move;

STL в его текущей форме тоже не так уж и плох, но, конечно, более многословен:

#include <algorithm>
#include <iterator>

std::vector<Class> someVector;

std::transform(std::move_iterator(mapOfObjects.begin()),
        std::move_iterator(mapOfObjects.end()),
        std::back_inserter(someVector),
        [](std::pair<int, Class>&& entry){ return std::move(entry.second); });
0 голосов
/ 12 ноября 2018

Вы, безусловно, можете перейти shared_ptr с unordered_map на vector. Все, что вам нужно сделать, это использовать std::move в вашем примере:

someVector.push_back(std::move(object.second));

Имейте в виду, что после этой операции может потребоваться очистить карту, поскольку она теперь содержит пустые объекты.

...