这是Char* vs String Speed in C++的后续问题。 我已经声明了以下变量:
std::vector<std::string> siteNames_;
std::vector<unsigned int> ids_;
std::vector<std::string> names_;
我称这个功能成千上万次,是一个主要的瓶颈。是否有更有效的方法来比较字符串?答案必须是跨平台兼容的。
unsigned int converter::initilizeSiteId(unsigned int siteNumber){
unsigned int siteId = 0;
for (unsigned int i = 0; i < ids_.size(); i ++){
if (siteNames_[siteNumber].compare(names_[i]) == 0){
siteId = ids_[i];
break; // Once found, will stop searching and break out of for loop
}
}
if (siteId == 0)
std::cerr << "Could not find ID for site number " << siteNumber << std::endl;
return siteId;
}
答案 0 :(得分:5)
使用map或unordered map代替。然后你可以这样做:
std::map<string, int>names_;
// ...
unsigned int converter::initilizeSiteId(unsigned int siteNumber){
unsigned int siteId = 0;
std::map<string, int>::iterator i = names_.find(siteNames_[siteNumber]);
if (i != names_.end()){
siteId = i->second;
}
else (siteId == 0)
std::cerr << "Could not find ID for site number " << siteNumber << std::endl;
return siteId;
}
这将在O(log n)时间内执行,而不是之前的O(n)。
如果您有排序列表,还有其他选项,例如binary search。
答案 1 :(得分:0)
如果你经常查找几个不同的siteNumber并调用它足够多次,那么实现一个缓存以存储最新的siteNumber:s是值得的。虽然你只是在内存中而不是从磁盘上工作,但我对此表示怀疑。