这是一个后续问题C++ 中的 Char* 与 String Speed https://stackoverflow.com/q/3989111/363829。
我声明了以下变量:
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;
}
Use a map http://www.cplusplus.com/reference/stl/map/ or 无序映射 http://publib.boulder.ibm.com/infocenter/comphelp/v9v111/index.jsp?topic=/com.ibm.xlcpp9.aix.doc/standlib/stl_unordered_map.htm反而。然后你可以这样做:
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) 时间。
如果您有排序列表,还有其他选项,例如二分查找 http://en.wikipedia.org/wiki/Binary_search_algorithm.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)