繁体   English   中英

将std :: unordered_map值移动到std :: vector

[英]Moving an std::unordered_map values to std::vector

有没有办法 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;
    }  
}

提前感谢您提供所有有用的答案。

你当然可以将shared_ptrunordered_map移动到vector 您需要做的就是在您的示例中使用std::move

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

请记住,在此操作之后,您可能希望清除地图,因为它现在包含空对象。

@ 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); });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM