Tôi đã tìm kiếm nhưng tôi chỉ tìm thấy câu hỏi về hàm tạo di chuyển với giá trị được ánh xạ được ánh xạ, nhưng tôi muốn thử một cái gì đó khác.Phím di chuyển từ unordered_map
Có thể sử dụng std::move
phím từ số std::unordered_map
? Lý do khá đơn giản: Tôi muốn xây dựng một ví dụ mà tôi tạo ra một vector từ bản đồ, lãng phí ít nhất có thể của bộ nhớ. Tôi biết nó sẽ rối tung lên với sự đại diện của bản đồ, nhưng hey, sau khi tất cả tôi sẽ không bao giờ sử dụng bản đồ một lần nữa, vì vậy nó sẽ có ý nghĩa để di chuyển các giá trị ra.
Đoán của tôi là: không, tôi không thể làm điều đó. Tuy nhiên, tôi muốn một số xác nhận.
Đây là một mã đơn giản. Tôi dự kiến sẽ thấy hàm khởi tạo được gọi, nhưng tôi có hàm tạo bản sao được gọi.
Chúc mừng & Cảm ơn!
#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;
}
đầu ra
>>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
Chỉ cần * phím * chứ không phải dữ liệu cho khóa đó? –
Vâng, chỉ là chìa khóa. Tôi cũng có thể giải quyết việc di chuyển cặp đôi. – senseiwa