2013-11-21 25 views
5

Aradım ama sadece eşlenmiş değeri ile taşıt yapıcı hakkında sorular buldum, ancak farklı bir şey denemek istiyorum.Anahtarları unordered_map

anahtarını std::unordered_map'dan kullanmak mümkün mü? Nedeni oldukça basit: Haritadan bir vektör yarattığım, hafızadan mümkün olduğunca az israf ettiğim bir örnek oluşturmak istiyorum. Haritanın temsiliyle uğraşacağını biliyorum, ama sonuçta haritayı bir daha asla kullanmayacağım, bu yüzden değerleri dışarıya taşımak mantıklı olacaktır.

Tahminim şudur: hayır, bunu yapamam. Ancak, bazı onaylar istiyorum.

İşte basit bir kod. Taşınan kurucuyu görmeyi bekledim, ama adında kopya kurucusu var.

Alkışlar & Teşekkürler!

#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; 
} 

çıkış

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

Sadece * anahtar *, ve bu anahtarın verilerini değil? –

+0

Evet, sadece anahtar. Yine de çifti hareket ettirmek için yerleşebilirim. – senseiwa

cevap

5

Burada öylesine

value_type std::pair<const Key, T> 

http://en.cppreference.com/w/cpp/container/unordered_map ,

for (auto &p : map) 
beri tuşları kopyalanacağından, hareket edemez

p, std::pair<const std::string, int> için çıkarılacaktır.

+4

Ancak izin vermeyi denedik: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3586.pdf –

İlgili konular