से मूविंग कुंजियां मैंने खोज की है लेकिन मुझे केवल मैप किए गए मान के साथ कन्स्ट्रक्टर के बारे में प्रश्न मिलते हैं, लेकिन मैं कुछ अलग करना चाहता हूं।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
बस * कुंजी *, और उस कुंजी के लिए डेटा नहीं? –
हां, बस कुंजी। हालांकि, मैं जोड़ी को स्थानांतरित करने के लिए भी व्यवस्थित हो सकता था। – senseiwa