2015-03-14 2 views
6

Я реализую какой-то поиск слов в C++, и хотя код для реализации карты есть, я хочу убедиться, что он работает, используя карту с ключами и значениями как std :: string, и используя только ключи как поисковые запросы без возвращаемого значения.Словарь на C++ с использованием карты без значений, только ключи

std::vector< std::string> DictionLines; 
    Reader DictionReader(Dictionary); 
    DictionLines = DictionReader.getLines(); 
    std::map<std::string, std::string> DictionaryM; 

    for (int t = 0; t < DictionLines.size(); ++t) { 
     DictionaryM.insert(std::pair<std::string, std::string>(DictionLines.at(t), DictionLines.at(t))); 
    } 

Этот код содержит 349900 слов в файле Dictionary.txt и сохраняет их на карте. Каждая строка словаря - это просто слово для поиска; нет определения или какой-либо ценности для связи. Вот почему я думаю, что просто сохранение пары одного и того же ключа и значения на карте в порядке, и использование find и first/second также будет в порядке? Пожалуйста подтвердите.

+3

Вы ... знаете о std :: set right? – Ludwik

ответ

12

Похоже, вы хотите std::set. Это похоже на карту, где важны только ключи, и вы никогда не заботитесь или не используете значение. Чтобы посмотреть в словаре, представленном как std::set<std::string> для некоторого слова после заданного префикса, рассмотрите lower_bound

Вы должны больше взглянуть на стандарт C++ containers. Вариантов выбора не так много, и вы должны как-то их знать (и выбрать или объединить правильные контейнеры для работы)

+0

Другими словами, значения ** являются ** ключами. – Ludwik

+0

Я знаю, что я отметил это как ответ, но PLZ помочь снова. Я искал древовидную структуру из-за скорости O (log n) при поиске определенного ключа. Однако теперь, когда я реализовал это как набор и подумал о своем следующем шаге, я понимаю, что я не ищу ключ специально; Я просматриваю словарь для слов, которые имеют ту же длину, что и мой «ключ». Разве это в конечном итоге не вернется к O (n) времени, если я линейно перейду через множество, подобное этому? Это своего рода проверка орфографии, которую я реализую. – Kthieu

+1

@ Kthieu Звучит так, будто вам нужна карта, где ключи длинны, а значениями являются контейнеры со словами этой длины (может быть простой список, может быть установлен, может быть картой) или просто 'std :: multimap'. Также обратите внимание, что для поиска, * O (log n) * вы упоминаете * медленно *, а не быстро. Неупорядоченные карты и наборы (реализованные с помощью хеш-таблиц и часто называемые хэшами или хэшмапами в C++ 'std :: unordered_set' и' std :: unordered_map') достигают * O (n) * поиска и (амортизированного) времени вставки. TL; DR Знайте свои контейнеры, также как и в этом ответе! – hyde

Смежные вопросы