Гораздо проще ответ, чем мой первый.У вас есть std :: set of strings:
typedef std::set<std::string>::iterator iter_type;
std::set<std::string> data;
и функция с именем find (), которая возвращает пару итераторов.Первый итератор указывает на начало строк, которые соответствуют префиксу, а последний итератор - один после последней строки, которая соответствует префиксу.Если у вас есть 10000 строк, нужно проверить только около 26 из них.
std::pair<iter_type, iter_type> find(std::string substr) {
std::pair<iter_type, iter_type> r;
r.first = data.lower_bound(substr);
substr[substr.size()-1]++; //I'm assuming substr is at least one character
r.second = data.upper_bound(substr);
return r;
}
Затем, после загрузки данных, вы просто вызываете функцию find (...), и она возвращаетпара итераторов, указывающая на нужные вам строки.Вы можете использовать их в качестве входных данных для любого стандартного алгоритма или делать что угодно.
int main() {
data.insert("catalog");
data.insert("catalyst");
data.insert("ban");
data.insert("bany");
//find the region of strings beginning with "cat"
std::pair<iter_type, iter_type> range = find("cat");
//display them all
for(iter_type i=range.first; i!=range.second; ++i)
std::cout << *i << '\n';
}