std::map
+ C ++ 11 pola lambdas tanpa enum
unordered_map
untuk potensi diamortisasi O(1)
: Apa cara terbaik untuk menggunakan HashMap di C ++?
#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;
}
}
Keluaran:
one 1
two 2
three 3
foobar -1
Penggunaan metode dalam dengan static
Untuk menggunakan pola ini secara efisien di dalam kelas, inisialisasi peta lambda secara statis, atau Anda membayar O(n)
setiap waktu untuk membangunnya dari awal.
Di sini kita bisa lolos dengan {}
inisialisasi static
variabel metode: Variabel statis dalam metode kelas , tetapi kita juga bisa menggunakan metode yang dijelaskan di: konstruktor statis di C ++? Saya perlu menginisialisasi objek statis pribadi
Itu perlu untuk mengubah penangkapan konteks lambda [&]
menjadi argumen, atau yang tidak akan ditentukan: const static auto lambda digunakan dengan penangkapan dengan referensi
Contoh yang menghasilkan output yang sama seperti di atas:
#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;
}
}