std::map
+ सी + + 11 लैम्ब्डा पैटर्न एनम के बिना
unordered_map
संभावित परिशोधन के लिए O(1)
: C ++ में HashMap का उपयोग करने का सबसे अच्छा तरीका क्या है?
#include <functional>
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
int main() {
int result;
const std::unordered_map<std::string,std::function<void()>> m{
{"one", [&](){ result = 1; }},
{"two", [&](){ result = 2; }},
{"three", [&](){ result = 3; }},
};
const auto end = m.end();
std::vector<std::string> strings{"one", "two", "three", "foobar"};
for (const auto& s : strings) {
auto it = m.find(s);
if (it != end) {
it->second();
} else {
result = -1;
}
std::cout << s << " " << result << std::endl;
}
}
आउटपुट:
one 1
two 2
three 3
foobar -1
के साथ तरीकों के अंदर उपयोग static
कक्षाओं के अंदर कुशलता से इस पैटर्न का उपयोग करने के लिए, लैम्बडा मानचित्र को वैधानिक रूप से आरंभ करें, या फिर आप भुगतान करें O(n)
इसे खरोंच से बनाने के हर बार करते हैं।
यहां हम {}
एक static
विधि चर के आरंभ के साथ दूर हो सकते हैं : वर्ग विधियों में स्थैतिक चर , लेकिन हम यहां वर्णित विधियों का भी उपयोग कर सकते हैं: C ++ में स्थिर निर्माणकर्ता? मुझे निजी स्थिर वस्तुओं को इनिशियलाइज़ करने की आवश्यकता है
लंबर संदर्भ कैप्चर [&]
को एक तर्क में बदलना आवश्यक था , या जो अपरिभाषित था: संदर्भ द्वारा कैप्चर के साथ उपयोग किए जाने वाले स्थिर स्थिर ऑटो लैम्ब्डा
उदाहरण जो ऊपर के समान आउटपुट का उत्पादन करता है:
#include <functional>
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
class RangeSwitch {
public:
void method(std::string key, int &result) {
static const std::unordered_map<std::string,std::function<void(int&)>> m{
{"one", [](int& result){ result = 1; }},
{"two", [](int& result){ result = 2; }},
{"three", [](int& result){ result = 3; }},
};
static const auto end = m.end();
auto it = m.find(key);
if (it != end) {
it->second(result);
} else {
result = -1;
}
}
};
int main() {
RangeSwitch rangeSwitch;
int result;
std::vector<std::string> strings{"one", "two", "three", "foobar"};
for (const auto& s : strings) {
rangeSwitch.method(s, result);
std::cout << s << " " << result << std::endl;
}
}