23


28

私は数行で収まるC / STLコードの実用的で教育的なサンプルを探しています。 私の実際のお気に入りは:

  1. 予約されたメモリを解放しているベクトルを空にします。

ベクトル<...>()。スワップ(v)

(一時的なものと交換) . 地図をベクトルにコピーします。

myMapをマップします。 vector <pair> myVec(myMap.begin()、myMap.end());
// or
myVec.assign(myMap.begin()、myMap.end());
  1. カスタムの非ブースト分割:

ベクター

8 Answer


13


私のお気に入りはコンテナを出力にコピーすることです。そして入力ストリームをコンテナにコピーします。

#include #include #include #include

int main(){std :: vectorデータ; std :: copy(std :: istream_iterator(std :: cin)、std :: istream_iterator()、std :: back_inserter(data));

std :: copy(data.begin()、data.end()、std :: ostream_iterator(std :: cout、 "\ n")); }


7


`+ remove()`または ` remove_if()+`によって削除された要素を実際に削除するには、次のイディオムが必要です。

vector v;
...
v.erase(remove(v.begin(), v.end(), 42), v.end());

`+ remove()`と ` remove_if()+`は、削除されていない要素を前方にスライドさせ、新しい範囲の終了位置を報告します。コンテナだけでなく、イテレータ範囲。


6


// std::back_inserter usage ( std::inserter for map )
std :: copy(source.begin()、source.end()、std :: back_inserter(container));

-

// mem_fun and bind usage (but boost better)
std :: some_algorithm(...、std :: mem_fun(func));

それほど便利ではありませんが強力です。

チェックはコンテナソートされています

std :: adja_find(container.begin()、container.end()、greater())== container.end()

また、あなたがあからさまに言った例。


2


copy(istreambuf_iterator(cin)、istreambuf_iterator()、ostream_iterator(cout));

よく使われる慣用句は、配列からコンテナを初期化することです。

#名前空間stdを使用します。

int main(){typedef std :: map LUT; typedef LUT :: value_type LUT_item_t;

const LUT_item_t items [] = {LUT_item_t( 'b'、1)、LUT_item_t( 'a'、5)};

LUT my_map(アイテム、アイテムのサイズ/アイテムのサイズ/アイテムのサイズ[0]); 0を返します。 }

しかし、もしあなたが純粋な魔法が欲しいのなら、 Boost Lambda Library;)を見てください。

ベクトルvp(10)。 sort(vp.begin()、vp.end()、* _ 1> * _ 2);


2


私が一番好きなのは、一種のデリゲートでbind1st / bind2nd / mem_funを使うことです。

// will call a->func(v[i])
for_each(v.begin()、v.end()、bind1st(mem_fun(

// will call w[i]->func(72)
for_each(w.begin()、w.end()、bind2nd(mem_fun(

boostのバインドと機能を使う方がはるかに良いのですが、STLだけでできることは印象的です。


1


2番目の例では、値の型を使用します。

#

地図をベクトルにコピーします。

typedefマップMyMap。 MyMap myMap; vector <MyMap :: value_type> myVec(myMap.begin()、myMap.end());


0


私はこれをファイルの各行をループするのが好きです。 博士のAndrew Koenigコラムより ドブス

for(string s; getline(stream、s);){//プロセスライン}


0


ラムダ関数と組み合わせてstd

for_eachを使用する(C 11以降)

std :: vector v(20);

std :: for_each(v.begin()、v.end()、[](int item){std :: cout << item;});

の代わりに

(std :: vector :: const_iterator it = v.begin(); it!= v.end(); it){std :: cout << * it; }

見栄えの良いループになります。