std::map
এনাম ছাড়া সি ++ 11 ল্যাম্বডাস প্যাটার্ন
unordered_map
সম্ভাব্য amorised জন্য O(1)
: সি ++ এ একটি হ্যাশম্যাপ ব্যবহার করার সবচেয়ে ভাল উপায় কী?
#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
পদ্ধতি ভেরিয়েবলের সূচনা দিয়ে পালাতে পারি : ক্লাস পদ্ধতিতে স্ট্যাটিক ভেরিয়েবল , তবে আমরা বর্ণিত পদ্ধতিগুলিও ব্যবহার করতে পারি: সি ++ এ স্থিতিশীল নির্মাণকারী? আমার প্রাইভেট স্ট্যাটিক অবজেক্টগুলি আরম্ভ করতে হবে
ল্যাম্বডা প্রসঙ্গে ক্যাপচারটিকে [&]
আর্গুমেন্টে রূপান্তর করা প্রয়োজন ছিল বা এটি অপরিজ্ঞাত করা হত : কনস্ট স্ট্যাটিক অট ল্যাম্বদা রেফারেন্স দ্বারা ক্যাপচারের সাথে ব্যবহৃত হয়েছে
উপরের মত একই আউটপুট উত্পাদন করে এমন উদাহরণ:
#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;
}
}