比较字符串的瓶颈

Elp*_*rto 0 c++ string

这是C++中Char*vs String Speed的后续问题.我已经声明了以下变量:

std::vector<std::string> siteNames_;
std::vector<unsigned int> ids_;
std::vector<std::string> names_;
Run Code Online (Sandbox Code Playgroud)

我称这个功能成千上万次,是一个主要的瓶颈.是否有更有效的方法来比较字符串?答案必须是跨平台兼容的.

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;
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*shD 5

请改用地图无序地图.然后你可以这样做:

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;
}
Run Code Online (Sandbox Code Playgroud)

这将在O(log n)时间内执行,而不是之前的O(n).

如果您有一个排序列表,还有其他选项,例如二进制搜索.

  • 通常`unordered_map`可以更好地进行频繁查找. (2认同)