Dictionary::Dictionary() {
ifstream infile;
infile.open("words");
string wread;
while(getline(infile,wread)){
wordset.insert(wread);
vector<string> st =Read::Trigrams(wread);
//Word w(wread,st) stack försvinner när vi lämnar metoden.
words[wread.length()].push_back(Word(wread,st)); //stack eller heap
}
infile.close();
}
这是一个类Dictionary的构造函数。 我想创建一个单词对象并将其添加到矢量。 我应该写 。字[wread.length()]的push_back(字(wread,ST)); 要么 字w(wread,st); 。字[wread.length()]的push_back(W); w将在堆栈上分配,当我们离开构造函数时它将被删除。
答案 0 :(得分:1)
在C ++ 11中,如果push_back(Word());
具有移动构造函数,则第一种形式Word
将更有效。第二种形式无论如何都会复制。
功能明智,两者都是等价的。第二个污染范围,第一个没有。第一种更有可能被有效地优化,第二种不是。
除非受到向后兼容性的限制,否则您应使用vector::emplace_back
并传递T
的值或其构造函数之一的参数。
答案 1 :(得分:1)
“正确”的方法是使用emplace_back
,它将就地构建Word,甚至删除移动。
请注意,emplace_back
采用与对象构造函数相同的参数。
答案 2 :(得分:0)
您提到的两种表单都不会在堆上分配。要在堆上分配,您通常会使用new
关键字
new Word()
还有其他方法可以在堆上分配std::make_shared
。但是您的样本中没有使用任何内容。简单地使用Word()
将在堆栈上分配