比较字符串的瓶颈

时间:2010-10-21 22:32:08

标签: c++ string

这是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;
}

2 个答案:

答案 0 :(得分:5)

使用mapunordered 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是值得的。虽然你只是在内存中而不是从磁盘上工作,但我对此表示怀疑。