Как заменить struct С++

У меня есть следующая структура

struct LetterFreq{
 char letter;
 ****** freq;
};

Теперь я пытаюсь создать std: список из этих...

std::list<letterfreq> freqList;
LetterFreq f = {'A',.08167};
freqList.push_back(f);
f = {'B',.01492};
freqList.push_back(f);
</letterfreq>

Однако, когда я пытаюсь скомпилировать, я получаю...

error: expected expression

Если я перейду на что-то вроде...

std::list<letterfreq> freqList;
LetterFreq f = {'A',.08167};
freqList.push_back(f);
LetterFreq f2 = {'B',.01492};
freqList.push_back(f2);
</letterfreq>

Кажется, это работает, но я действительно этого не хочу. Я предпочел бы повторно использовать переменную f.

3 ответа

Без C++ 11 вы можете сделать это:

struct LetterFreq{
 char letter;
 ****** freq;

 LetterFreq(char letter, ****** freq)
 : letter(letter), freq(freq)
 {}
};

f = LetterFreq('B',.01492);


Если у вас есть С++ 11, вы можете использовать:

std::list<letterfreq> freqList;
freqList.emplace_back('A', .08167);
freqList.emplace_back('B', .01492);
</letterfreq>

Или еще лучше, используйте списки инициализаторов, как это:

std::list<letterfreq> freqList { {'A', .08167}, {'B', .01492} };
</letterfreq>


Ловушка, в которую вы попадаете, состоит в том, что списки инициализации выполняются с помощью конструктора. Во втором примере, поскольку вы каждый раз создаете новые объекты (а не существующие), компилятор вызывает конструктор с вашим списком инициализации.

В вашем первом примере ему нужно будет вызвать оператор присваивания, который не поддерживает списки инициализации и действительно, а также не должен :)

licensed under cc by-sa 3.0 with attribution.