std::map
+ รูปแบบ lambdas โดยไม่มี enums
unordered_map
สำหรับค่าตัดจำหน่ายที่อาจเกิดขึ้นO(1)
: วิธีที่ดีที่สุดในการใช้ HashMap ใน 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;
}
}
เอาท์พุท:
one 1
two 2
three 3
foobar -1
วิธีการใช้งานภายในด้วย static
หากต้องการใช้รูปแบบนี้อย่างมีประสิทธิภาพภายในชั้นเรียนให้เริ่มต้นแผนที่แลมบ์ดาแบบคงที่หรืออื่นที่คุณจ่าย O(n)
ทุกครั้งเพื่อสร้างตั้งแต่เริ่มต้น
ที่นี่เราสามารถไปด้วยการ{}
เริ่มต้นของstatic
ตัวแปรวิธีการ: ตัวแปรคงที่ในวิธีการเรียนแต่เรายังสามารถใช้วิธีการที่อธิบายไว้ที่: constructors คงที่ใน 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;
}
}