2014-02-27 154 views
0

假设我给出了一个字符串向量vector<string> names = {"ab","abs","act","add"}。我也给了一个字符串前缀string prefix ("ab")。我的工作是填充另一个字符串矢量(我们称之为vector<string> name_list),其中包含以给定前缀开头的所有名称。目前我正在通过简单地使用字符串比较功能来做到这一点,如下所示:C++:搜索以给定前缀开头的字符串数组

for (int i = 0; i < names.size(); ++i) 
{ 
    if (names[i].compare(0, prefix.size(), prefix) == 0) // If name begins with prefix 
     (*name_list).push_back(names[i]); 
} 

这适用于小向量。在上面的例子中,输出将是["ab","abs"]我的问题是如果这是最有效的算法,当names让我们说数百万字符串。如果不是,还可以使用哪些其他算法?

+1

为了节省一些内存,你可以读取字符串到一个trie – keyser

+0

我认为使用后缀数组可以减少比较次数。 – rendon

回答

0

从迭代器开始,迭代器被std::set<std::string>::lower_bound(prefix)重新搜索并且线性向前搜索。

std::set<std::string> names {"ab","abs","act","add"}; 
std::string prefix = "ab"; 
auto itr = names.lower_bound(prefix); 
while (itr != names.end() && !prefix.compare(*itr, 0, prefix.size())) { 
    // matching string 
    ++itr; 
}