C ++: поиск в массиве строк, начинающихся с заданного префикса

0

Предположим, что мне присвоен векторный vector<string> names = {"ab","abs","act","add"}. Мне также присваивается префикс string prefix ("ab"). Моя задача состоит в том, чтобы заполнить еще один вектор строки (пусть назовите его vector<string> name_list) со всеми именами, начинающимися с данного префикса. В настоящее время я делаю это, просто используя функцию сравнения строк, например:

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
    Чтобы сохранить память, вы можете прочитать строки в три
  • 0
    Я думаю, что использование суффиксного массива может уменьшить количество сравнений.
Теги:
string
vector
substring
prefix

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню