std::map
+ Mô hình lambdas C ++ 11 không có enum
unordered_map
cho khoản khấu hao tiềm năng O(1)
: Cách tốt nhất để sử dụng HashMap trong C ++ là gì?
#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;
}
}
Đầu ra:
one 1
two 2
three 3
foobar -1
Sử dụng các phương thức bên trong với static
Để sử dụng hiệu quả mẫu này bên trong các lớp, hãy khởi tạo bản đồ lambda một cách tĩnh hoặc nếu không bạn phải trả tiền O(n)
mỗi lần để xây dựng nó từ đầu.
Ở đây chúng ta có thể thoát khỏi việc {}
khởi tạo một static
biến phương thức: Biến tĩnh trong các phương thức lớp , nhưng chúng ta cũng có thể sử dụng các phương thức được mô tả tại: constructor tĩnh trong C ++? Tôi cần khởi tạo các đối tượng tĩnh riêng
Cần phải chuyển đổi bắt giữ bối cảnh lambda [&]
thành một đối số hoặc điều đó sẽ không được xác định: const lambda tự động tĩnh được sử dụng với chụp bằng tham chiếu
Ví dụ tạo ra cùng một đầu ra như trên:
#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;
}
}