У меня есть файл в качестве входных данных из Аргументов команд. Я читаю каждой строке так:Читать из файла и эффективно добавлять слова в дерево
vector<string> filewords;
string line;
while(getline(cin, line){
filewords.push_back(line);
}
я не нашел никакого другого способа получить строки из файла, если я мог бы получить содержание целого в мега-строки, было бы здорово, но я гавань «т нашел, как
добавить слова к синтаксическому дереву таким образом:
for(const auto &word : *filewords){
if(word.length() >= 3 && word.length() <= 17){
root->addString(word.c_str());
}
}
Мне нужно, чтобы проверить, что каждая линия имеет определенную длину, прежде чем добавить в синтаксическое дерево. AddString является:
void Node::addString(const char* word)
{
if(!mChildren[*word - 'a']) mChildren[*word - 'a'] = new Node(word);
if(word[1]) mChildren[*word - 'a']->addString(word + 1);
else mChildren[*word - 'a']->setMarker(true);
}
дети упорядочены по алфавиту, так «а» находится в положении 0 и так далее.
Узел представляет собой класс со следующим конструктором:
Node::Node(const char* a)
{
mContent = *a;
mChildren.resize(26);
}
Там будет не более 26 детей (26 букв в алфавите)
Я не уверен, если маленькие оптимизации я сделал (делая mChildren размером 26, добавляя каждую строку к вектору, а затем итерируя через этот вектор ...) на самом деле стоит того, или если есть лучший способ.
Я предполагаю, что эта часть программы продлится ~ 80 мс, и сейчас требуется ~ 120 мс с файлом, состоящим из ~ 180 000 слов.
Любые идеи о том, как оптимизировать/уменьшить сложность/улучшить код? Благодаря!
Как вы измеряете время? Вы пытались измерить или профилировать различные части кода, чтобы узнать, где узкие места? И если вы проверите [ссылку с хорошим исходным потоком] (http://en.cppreference.com/w/cpp/io/basic_istream), вы можете найти некоторый метод [чтения больших фрагментов] (http: //en.cppreference. ком/ж/CPP/И.О./basic_istream/чтения). –
Также вы знаете, что 'std :: getline' читает целую строку * ни одного слова? Это будет работать, только если каждая строка является одним словом. –
Забыл упомянуть, извините, каждая ильна - это всегда слово. Я не могу использовать ссылку на другой входной поток, кроме cin, потому что имя файла находится в аргументах команды. Что касается времени, я ставлю часы до и после этих операций и получаю разницу. Я понятия не имею, куда поместить часы во внутренние функции, так как они будут исполнены 180000 раз. Благодаря! – Ane