if
语句看起来太尴尬了,因为我需要增加常数的可能性。
很抱歉让你因为“常数”而不是我的意思而陷入妄想。
答案 0 :(得分:9)
将所有常量添加到std :: set,然后您可以检查该集是否包含带
的字符串std::set<std::string> myLookup;
//populate the set with your strings here
set<std::string>::size_type i;
i = myLookup.count(searchTerm);
if( i )
std::cout << "Found";
else
std::cout << "Not found";
答案 1 :(得分:3)
取决于您是否关心表现。
如果没有,那么最简单的代码可能是将各种字符串放在一个数组中(如果你想在运行时增加常量的数量,则为向量)。对于少量字符串,这也会非常快:
static const char *const strings[] = { "fee", "fie", "fo", "fum" };
static const int num_strings = sizeof(strings) / sizeof(char*);
然后:
int main() {
const char *search = "foe";
bool match = false;
for (int i = 0; i < num_strings; ++i) {
if (std::strcmp(search, strings[i]) == 0) match = true;
}
}
或者:
struct stringequal {
const char *const lhs;
stringequal(const char *l) : lhs(l) {}
bool operator()(const char *rhs) {
return std::strcmp(lhs, rhs) == 0;
}
};
int main() {
const char *search = "foe";
std::find_if(strings, strings+num_strings, stringequal(search));
}
[警告:我还没有测试过上面的代码,而且我已经多次签名错误了......]
如果你关心性能,并且有合理数量的字符串,那么一个快速选项就像Trie。但是,由于标准C ++库中没有一个,因此需要付出很多努力。您可以使用排序的数组/向量获得大部分好处,使用std::binary_search
搜索:
// These strings MUST be in ASCII-alphabetical order. Don't add "foo" to the end!
static const char *const strings[] = { "fee", "fie", "fo", "fum" };
static const int num_strings = sizeof(strings) / sizeof(char*);
bool stringcompare(const char *lhs, const char *rhs) {
return std::strcmp(lhs, rhs) < 0;
}
std::binary_search(strings, strings+num_strings, "foe", stringcompare);
...或使用std::set
。但除非您在运行时更改字符串集,否则在使用二进制搜索的排序数组上使用集合没有任何优势,并且必须使用代码填充集合(或向量),而可以静态初始化数组。我认为C ++ 0x将使用集合的初始化列表来改进。
答案 2 :(得分:2)
将要比较的字符串放在静态向量或集合中,然后使用std :: find算法。
答案 3 :(得分:1)
技术上最好的解决方案是:根据您的字符串常量集构建一个“完美的哈希函数”,以便稍后在散列期间不会发生冲突。
答案 4 :(得分:0)
const char * values[]= { "foo", "bar", ..., 0 };
bool IsValue( const std::string & s ) {
int i = 0;
while( values[i] ) {
if ( s == values[i] ) {
return true;
}
i++;
}
return false;
}
或者使用std :: set。