2013-11-21 10 views
5

से मूविंग कुंजियां मैंने खोज की है लेकिन मुझे केवल मैप किए गए मान के साथ कन्स्ट्रक्टर के बारे में प्रश्न मिलते हैं, लेकिन मैं कुछ अलग करना चाहता हूं।unordered_map

यह एक std::unordered_map से std::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 
+0

बस * कुंजी *, और उस कुंजी के लिए डेटा नहीं? –

+0

हां, बस कुंजी। हालांकि, मैं जोड़ी को स्थानांतरित करने के लिए भी व्यवस्थित हो सकता था। – senseiwa

उत्तर

5

आप स्थानांतरित नहीं कर सकते, कुंजी कॉपी किया जायेगा,

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> पर ले जाया जाएगा।

+4

लेकिन हमने इसे अनुमति देने का प्रयास किया: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3586.pdf –

संबंधित मुद्दे