Трудно что-то сказать, не видя реализации Vector
.Если мы предполагаем, что он соответствует стандартным соглашениям о контейнерах (и при этом не возникает ошибка при попытке сделать это): вы выполняете итерацию, начиная с it.begin(), but immediately access
it-1 . That's undefined behavior for a standard container. (I
don't know what it will do with your implementation of
Vector`, но для этого потребуется некоторый хитрый кодэто работает.)
На более высоком уровне кажется несоответствие основным: вы сохраняете вектор отсортированным, но все еще используете линейный поиск.Если вы используете линейный поиск, нет смысла сохранять вектор отсортированным;просто используйте:
Vector<wordCount>::iterator it = words.begin();
while ( it != words.end() && *it != word ) {
++ it;
}
if ( it == words.end() ) {
// not found, append to end...
} else {
// found, do whatever is appropriate...
}
(хотя я, вероятно, добавлю конец, восстановите итератор для вновь вставленного элемента и обработайте его, как если бы он был найден).вы сохраняете вектор отсортированным, используйте бинарный поиск, а не линейный поиск.
В любом случае поместите поиск в отдельную функцию.(Если бы это была не домашняя работа, я бы сказал, что просто используйте std::vector
и либо std::find_if
, либо std::lower_bound
.)
Кроме того, почему new
во внутренней else
?Более разумным подходом было бы предоставить конструктор для wordCount
(который устанавливает счетчик в 0) и сделать что-то вроде:
if ( ! found ) {
it = words.insert( wordCount( word ) );
}
++ it->count;
Определение found
будет зависеть от того,используя бинарный поиск или нет.С точки зрения стандарта это может быть:
Vector<wordCount>::iterator it
= std::find_if( words.begin(), words.end(), MatchWord( word );
if ( it == words.end() ) {
it = words.insert( words.end(), wordCount( word ) );
}
++ it-count;
или
Vector<wordCount>::iterator it
= std::lower_bound( words.begin(), words.end(), word, CompareWord() );
if ( it == words.end() || it->val != word ) {
it = words.insert( wordCount( word ) );
++ it->count;
Возможно, вы должны стремиться к чему-то похожему, с отдельной функцией поиска, возвращая либо end
,или позиция для вставки, когда значение не найдено.
Это четко разделяет различные проблемы и позволяет избежать чрезмерного вложения в ваш код.(Вам, вероятно, следует стараться избегать break
в целом, и в случае множественных вложений if
s это совершенно недопустимо - вы заметите, что один из отвечавших на них людей пропустил их, и из-за этого неправильно понял поток управления.)