このコードはC++で正しいですか?C++の関数で値を返す
list<int> makelist(int litem)
{
list<int> newList;
newList.push_front(litem);
return newList;
}
リスト(#include <list>
)を値で返すのは問題になるでしょうか?
このコードはC++で正しいですか?C++の関数で値を返す
list<int> makelist(int litem)
{
list<int> newList;
newList.push_front(litem);
return newList;
}
リスト(#include <list>
)を値で返すのは問題になるでしょうか?
: は、私は以下のコードをお勧めしたいです。スピードが懸念される場合(プロファイラによって証明されるまで)、心配する必要はありません。一方、リストにコピーするときにいくつかの奇妙な副作用がある場合は、コピーコンストラクタの呼び出しの数を認識する必要がありますコンパイラと設定によって異なります。
これはうまくいくが、大量のメモリがコピーされる可能性があるので効率的ではない。次のC++標準では、この問題を解決することができます。 (オン最適化を実行している場合)は、通常、離れて最適化された値で返す、コメントとして
void fillList(list & lst) {
lst.push_front(...);
}
....
list newList;
fillList(newList);
あなたは単にタイプ(int型、float型、char型)でないローカルオブジェクトを返すことはできませんが、新しいオブジェクトへのポインタを返すことができます世話を
list<int>* makelist(int litem)
{
list<int>* newList = new list<int>();
newList->push_front(litem);
return newList;
}
その次の操作が必要メモリリークを避けるために後者のポインタを管理します。
http://en.wikipedia.org/wiki/Return_value_optimization –
これは問題ありません。問題は、離れたローカルオブジェクトへのポインタまたは参照を返すことです。これはリストをコピーするか、少なくとも持っているかのように動作します – jcoder
あなたの 'list'タイプがわからないときにこれが正しいかどうかをどのように知ることができますか? – sbi