2016-03-24 9 views
0

は、このように(C++:STLコンテナの要素を1つのステートメント内の変数に移動しますか?

//class C; 

C c_obj; 
std::list<C> my_list; 

//... 

std::swap(c_obj, my_list.front()); 
my_list.pop_front(); 

私は単に1つのステートメントで、リストから要素を除去しながらc_objするmy_list.front()の内容を移動したいのstd ::リストを使用して最小限の文の次のシーケンスを考えてみましょう文の数とコピーの数)。出来ますか?

ありがとうございました。

+2

そして場合に例外がコピーや削除の間にありますか? – Steephen

+0

いいえ、同じ表現の中で 'front()'と 'pop_front()'を得る方法はないと思います。少なくとも 'std :: list'クラスにはありません – vu1p3n0x

答えて

0

がポップ値を返す関数を作成し、std::exchange()を使用します。

C& pop_front(std::list<C>& cont) { 
    C& c(cont.front()); 
    cont.pop_front(); 
    return c; 
} 

int main() { 
    C c_obj; 
    std::list<C> my_list; 
    my_list.emplace_front(); 

    std::exchange(c_obj, pop_front(my_list)); 
} 
+0

std :: exchangeに言及していただきありがとうございます。私はそれについて知らなかった。あなたの方法は大丈夫です。ありがとう。 – booNlatoT

0

あなたのためにこれを行うために何かが組み込まれているとは本当に思いません。コピーしてポップアップする独自の関数を書くことができます。他の多くの用途でその関数を使用する可能性が低いことがわかっている場合は、ラムダ式にすることができます。そのため、実際には匿名関数呼び出しとして偽装された1つのステートメントになります。

http://en.cppreference.com/w/cpp/language/lambda

代わりに、そしてちょうどの要素にイテレータを扱う、新しいリストを作成し、次に何がスコープの外に出ていないことを確認して、一度に要素を1つずつ転送するスプライスを使用することができます新しいリスト。

関連する問題