2012-03-12 3 views
0

У меня есть код, который получает наиболее часто используемые слова и помещает их в вектор. Затем я сортирую вектор в числовом порядке, и все это отлично работает. Затем я пытаюсь изменить размер вектора до 10, чтобы получить первую десятку, которую я хочу сортировать по слову.Нет соответствующего конструктора для инициализации 'value type'

Я думаю, что проблема заключается в части моей структуры, но я не уверен, что вот код, который я использую.

struct wordFreq 
{ 
    string word; 
    int count; 

    wordFreq(string str, int c): word(str),count(c) { } 
}; 

words.resize(10); 

Любая помощь будет оценена по достоинству.

+1

Это весь код? Пожалуйста, напишите больше. – ApprenticeHacker

+0

Вы должны сказать нам, что это за переменная 'words' и как она объявлена. Мы не можем связать класс 'wordFreq' и переменную как это. –

+1

Это похоже на то же самое? http://stackoverflow.com/questions/1687152/stl-vector-and-c-how-to-resize-without-a-default-constructor – jcoder

ответ

3

При изменении размера вектора функция resize должна знать значение для новых элементов. Таким образом, вызов

words.resize(10); 

включает аргумент по умолчанию формы wordFreq(), которая является недействительной в вашем случае, поскольку класс wordFreq не имеет конструктора по умолчанию.

Если новые элементы не создаются, используйте erase вместо resize.

words.erase(words.begin() + 10, words.end()); 
+0

Не должно быть 'words.erase (words.begin() + 10, words.end());'? – Naveen

+0

@Naveen, конечно, спасибо! :) – avakar

+0

спасибо, что работал, я пробовал это раньше, но это не сработало, но это одно благодаря спасибо. – bobthemac

1

Поскольку вы используете vector::resize вектор пытается создать 10 объект с помощью по умолчанию CTOR из wordFreq класса. Поскольку нет доступных по умолчанию ctor, вы получаете ошибку компилятора. В случае, о котором вы упоминаете, нет необходимости использовать метод resize, вы можете просто пропустить 1..10, чтобы использовать 10 лучших элементов, поскольку вы уже отсортировали вектор.

0

Вам необходимо создать конструктор по умолчанию, поскольку вектор использует его, чтобы освободить место для новых элементов.

wordFreq() : word(""), count(0) { } 
0

vector::resize функция требует пунктов, чтобы иметь конструктор без параметров (конструктор по умолчанию). См. Раздел «Требования к контейнерам» в разделе MSDN page. Предложение «некоторые операции с контейнерами также может потребовать конструктор с открытым стандартом» относится к vector::resize.

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