gpt4 book ai didi

c++ - 从 unordered_map move 键

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:49 26 4
gpt4 key购买 nike

我已经搜索过,但我只发现了关于使用映射值 move 构造函数的问题,但我想尝试一些不同的东西。

是否可以使用 std::move 来自 std::unordered_mapkey?原因很简单:我想构建一个示例,在该示例中我从 map 创建一个 vector ,尽可能少地浪费内存。我知道这会弄乱 map 的表示,但是嘿,毕竟我再也不会使用 map 了,所以移出值是有意义的。

我的猜测是:不,我不能那样做。不过,我想确认一下。

这是一个简单的代码。我希望看到 move 构造函数被调用,但我调用了复制构造函数。

干杯,谢谢!

#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
#include <utility>

class prop
{
public:
prop(const std::string &s, int i) : s_(s), i_(i) { std::cout << "COPIED" << std::endl; };

prop(std::string &&s, int i) : s_(std::move(s)), i_(i) { std::cout << "MOVED" << std::endl; };

std::string s_;
int i_;
};

std::string gen_random(const int len) {
static const char alphanum[] =
"ABC";

std::string s;
s.resize(len);

for (int i = 0; i < len; ++i) {
s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
}

return s;
}

int main()
{
const long n = 3, len = 4, max = 20;

std::unordered_map<std::string, int> map;

std::cout << ">>GENERATING" << std::endl;
for (int i = 0; i < n; i++) map[gen_random(len)]++;

if (map.size() < max)
{
std::cout << ">>MAP" << std::endl;
for (auto &p : map) std::cout << p.first << " : " << p.second << std::endl;
}

std::cout << ">>POPULATING VEC" << std::endl;
std::vector<prop> vec;
vec.reserve(map.size());
for (auto &p : map) vec.push_back(prop(p.first, p.second));

if (map.size() < max)
{
std::cout << ">>VEC" << std::endl;
for (auto &p : vec) std::cout << p.s_ << " : " << p.i_ << std::endl;
std::cout << ">>MAP" << std::endl;
for (auto &p : map) std::cout << p.first << " : " << p.second << std::endl;
}

std::cout << ">>POPULATING MOV" << std::endl;
std::vector<prop> mov;
mov.reserve(map.size());
for (auto &p : map) mov.push_back(prop(std::move(p.first), p.second));

if (map.size() < max)
{
std::cout << ">>MOV" << std::endl;
for (auto &p : mov) std::cout << p.s_ << " : " << p.i_ << std::endl;
std::cout << ">>MAP" << std::endl;
for (auto &p : map) std::cout << p.first << " : " << p.second << std::endl;
}

return 0;
}

输出

>>GENERATING
>>MAP
CBAC : 1
BCAC : 1
BBCC : 1
>>POPULATING VEC
COPIED
COPIED
COPIED
>>VEC
CBAC : 1
BCAC : 1
BBCC : 1
>>MAP
CBAC : 1
BCAC : 1
BBCC : 1
>>POPULATING MOV
COPIED
COPIED
COPIED
>>MOV
CBAC : 1
BCAC : 1
BBCC : 1
>>MAP
CBAC : 1
BCAC : 1
BBCC : 1
Program ended with exit code: 0

最佳答案

你不能 move , key 会被复制,因为

value_type  std::pair<const Key, T>

http://en.cppreference.com/w/cpp/container/unordered_map所以,这里

for (auto &p : map)

p将被推断为 std::pair<const std::string, int> .

关于c++ - 从 unordered_map move 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20115813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com