我有一个方法,它采用两个参数,一个为string
,另一个为int
。
该字符串必须与 50个字符串进行比较,一旦找到匹配项,则需要使用硬编码字符串映射int值,如下例所示
EX:
string Compare_Method(std::string str, int val) {
if(str == "FIRST")
{
std::array<std::string, 3> real_value = {"Hello1","hai1","bye1"}
return real_value[val];
}
else if(str == "SECOND")
{
std::array<std::string, 4> real_value = {"Hello2","hai2","bye2"}
return real_value[val];
}
else if(str == "THIRD")
{
std::array<std::string, 5> real_value = {"Hello3","hai3","bye3"}
return real_value[val];
}
//----- 50+ else if
}
我的方法如上所述。什么是有效的方法
1。要比较50个以上的字符串。
2。为每个if情况创建std :: array
已编辑:std :: array的大小不固定,可以是上面编辑的3、4、5。
答案 0 :(得分:9)
这就是我的方法。数据结构只创建一次,访问时间应该足够快
tf.control_dependencies
如果#include <iostream>
#include <string>
#include <array>
#include <unordered_map>
std::string Compare_Method(const std::string& str, int val)
{
// or std::vector<std::string>
static std::unordered_map<std::string, std::array<std::string, 3>> map
{
{ "FIRST", { "Hello1", "hail1", "bye1" }},
{ "SECOND", { "Hello2", "hail2", "bye2" }},
{ "THIRD", { "Hello3", "hail3", "bye3" }},
// 50+ more
};
// maybe check if str is present in the map
return map[str][val];
}
int main()
{
std::cout << Compare_Method("SECOND", 1) << std::endl;
}
不够(快速),您可以想出某种静态的最佳哈希结构,因为键是在编译时知道的。
答案 1 :(得分:2)
如果这50个字符串是您在整个程序中广泛使用的字符串,则string
比较会降低性能。我建议您使它们适应enum
。
enum Strings
{
FIRST,
SECOND,
THIRD,
…
…
}
您显然需要一种方法,只要从源中获取string
到int
(用户输入,文件读取等)即可。这应该尽可能少用,因为您的系统现在可以使用枚举值(可以将其用作STL容器的索引,如我们在下一步中看到的那样)
int GetEnumIndex(const std::string& str)
{
// here you can map all variants of the same string to the same number
if ("FIRST" == str || "first" == str) return 1;
…
}
然后,比较方法可以基于enum
而不是string
:
std::string Compare_Method(const int& strIndex, int val)
{
static std::vector<std::vector<std::string>> stringArray
{
{ "Hello1", "hail1", "bye1" },
{ "Hello2", "hail2", "bye2", "aloha2" },
{ "Hello3", "hail3", "bye3", "aloha3", "tata3" },
…
};
return stringArray[strIndex][val];
}
答案 2 :(得分:2)
根据您提供的信息,我尝试了各种变体,以找到实现目标的最佳方法。我在这里列出了最好的一个。您可以查看其他方法here。
您可以编译它并运行run.sh
来比较所有情况下的性能。
std::string Method6(const std::string &str, int val) {
static std::array<std::string, 5> NUMBERS{"FIRST", "SECOND", "THIRD",
"FOURTH", "FIFTH"};
static std::array<std::vector<std::string>, 5> VALUES{
std::vector<std::string>{"FIRST", "hai1", "bye1"},
std::vector<std::string>{"Hello1", "SECOND", "bye1"},
std::vector<std::string>{"Hello1", "hai1", "THIRD"},
std::vector<std::string>{"FOURTH", "hai1", "bye1"},
std::vector<std::string>{"Hello1", "FIFTH", "bye1"}};
for (int i = 0; i < NUMBERS.size(); ++i) {
if (NUMBERS[i] == str) {
return VALUES[i][val];
}
}
return "";
}
为简单起见,我一直在使用NUMBERS
,长度为5,但是您可以使用任意长度。
VALUES
是std::array
中的std::vector
,因此您可以将任何数字if元素添加到std::vector
。
github代码的输出。
Method1 880 Method2 851 Method3 7292 Method4 989 Method5 598 Method6 440
根据您的系统和执行时的系统负载,您的输出可能会有所不同。