std::map
열거 형이없는 +++++ 람다 패턴
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
메소드 변수 의 초기화를 피할 수 있습니다 : 클래스 methods의 정적 변수 . 그러나 C ++의 정적 생성자에 설명 된 메소드를 사용할 수도 있습니다 . 개인 정적 객체를 초기화해야합니다
람다 컨텍스트 캡처 [&]
를 인수로 변환해야 하거나 정의되지 않았을 수 있습니다. const 정적 자동 람다 참조로 캡처와 함께 사용
위와 동일한 출력을 생성하는 예 :
#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;
}
}