![](/img/trans.png)
[英]std::vector or std::list for std::unordered_map buckets?
[英]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_ptr
從unordered_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.