2013-11-21 13 views
5

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 
+0

Chỉ cần * phím * chứ không phải dữ liệu cho khóa đó? –

+0

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

Trả lời

5

Bạn không thể di chuyển, phím sẽ được sao chép, vì

value_type std::pair<const Key, T> 

http://en.cppreference.com/w/cpp/container/unordered_map vậy, đây

for (auto &p : map) 

p sẽ được khấu trừ thành std::pair<const std::string, int>.

+4

Nhưng chúng tôi đã cố gắng cho phép: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3586.pdf –

Các vấn đề liên quan