2009-03-12 7 views
6

私はこの問題をstackoverflowで見つけることができません。しかし、私は人々がどのようにSTLを使うのか疑問に思っています。コード例とトリック多く、長年にわたって取得/ヒント/主に使用例...そしておそらく落とし穴...最も使用されるSTLアルゴリズム、述語、イテレータ

はのは、それを共有しましょう...

解答ごとに1つのチップは... -

を編集すると、それがダウンボックスの原因となるような悪い質問ですか?

+1

私はこの質問は本当に便利。しかし、無駄な答えに襲われています...貢献したすべての人に+1。 – AndreasT

答えて

7

私は、ループからイテレータを使って入力をプログラムに分割するまで、私のプロジェクトのほとんどすべてでSTLを使用します。後で解析するためのstd ::ベクトルに空間及び入力結果により入力文字列Tokenise

std::stringstream iss(input); 
std::vector<std::string> * _input = new std::vector<std::string>(); 

std::copy(std::istream_iterator<std::string>(iss), 
      std::istream_iterator<std::string>(), 
      std::back_inserter<std::vector<std::string> >(*_input)); 

他のお気に入りはオフコース逆:: STDと<algorithm>で定義された様々な他のアルゴリズムです。

6

ベクトルを使用してポインタ+新しいものを置き換えます。それは巨大です。

3

ほとんどの有用なアルゴリズム(私見) - のstd :: for_each

9

私のお気に入りである文字列へのストリーミング何かを変更するには、次その後

template <class TYPE> std::string Str(const TYPE & t) { 
    std::ostringstream os; 
    os << t; 
    return os.str(); 
} 

:あり

string beast = Str(666); 
+0

boost :: lexical_cast:P –

+2

オリジナルの質問を参照してください - ブーストは許可されていません –

+0

しかし、それはとにかくlexical_castのソースです。 –

1

ほとんどのSTLアルゴリズム、述語、イテレータは使用されません。これは、C++言語で最もよく使用される演算子が何であるかを尋ねるようなものです。あなたは何度も何を使用しますか、operator+またはoperator-ifwhileを好むですか?またはthrowにするか?

すべてを使用する必要があります。

PS:このような質問をする前に、Scott MeyersがEffective STLを読むことをお勧めします。

+1

私はその本を持っています –

+0

それから私はあなたがこの質問に驚いています:)本当に:) – Paul

+3

彼らは質問をするために愚かであると伝える人は役に立たない。 – catphive

1

「あなたのお気に入り/最も使用したブラシは何ですか? :)

+0

あなたがそれが役に立たないことを暗示しているなら、私は同意しません。彼らは彼らが使用する原材料も気にしています。表現主義者は大きなブラシを使って荒いストロークを行い、現実の画家は非常に細かいものを使用し、鉛筆などを使用します。プログラミングでも同様の違いがあります。 – Frank

+0

私は、STLにはさまざまな目標のためのさまざまなツールがあることを意味しました。我々の現在の仕事に依存して、私が必要としたツールは何かを比較することはできません。 – bayda

+0

私は画家です...プログラマーです。私は、画家が頻繁に好きなブラシ、ツール、テクニックについて話し合っていると伝えます。 – Benj

2

私はその時に達成しようとしていたものの中で最も良い仕事をしたアルゴリズム/述語/イテレータが好きで、あるいは最もよく使われていることを思い出すことはできません。

4

私はベクターが大好きです。 C++の配列であったはずです。私はリアルタイムの仕事をたくさんしています。意思決定を必要としない人は、リストを好むかもしれません。

ちょうど誰もがストリングから騒ぎを使用します。

ここでもVS6を使用しています(複雑なテンプレートの解析はできません)ので、アルゴリズムを使用することはあまりありません。それは間もなく終わります。

2

functionalもの:何らかの理由で1が結合を後押しするためのアクセス権を持っていない場合などbind1stbind2ndmem_funequal_toは、かなり便利です。

あなたのチームのコーディングスタイル、プロジェクトの種類、およびその他の未知の要因によって大きく左右されます。

6

私はistream_iteratorとostream_iteratorが大好きです。

ストリームを読み取り、それが他の容器のように見える作りの素敵な簡単な方法:

// Copies a stream of integers on the std input 
// into a vector. 
int main() 
{ 
    std::vector<int> data; 
    std::copy(std::istream_iterator<int>(std::cin), 
       std::istream_iterator<>(), 
       std::back_inserter(data) 
      ); 

    // By uisng the istream_iterator<> the input just becomes another container. 
} 
+0

これは本当に素晴らしいです!このオプションについて知りませんでしたありがとう! – petric

1

以下は、やや「悪」であるが、それは多くのバグから私たちを救いました。

(更新、@ Ricky65のコメントのおかげでここに戻ります)C++ 11のコンパイラでサポートされている場合は、これよりはるかに優れたrange-based for loopがあります。私たちはまだいくつかの実際に古いコンパイラで動作します。

 
#define FOREACH(iter,stlContainer) \ 
for (typeof(stlContainer.begin()) iter = stlContainer.begin(), \ 
            iter##End_Cached = stlContainer.end(); \ 
     iter != iter##End_Cached; \ 
     ++iter) 

(さらに更新、ブースト開発者の功績によるものです。)それは緩くマクロより複雑しかし、より可能BOOST_FOREACHに基づいていますが、デバッグでステップ実行するためにはるかに簡単であることの利点は、小さなケースのために構築しており、 (いくつかのコードベース/グループではverbotenです)ブーストヘッダの小さな山を必要としません。 std::for_eachを使用して

は、一般的に好ましいが、いくつかの欠点があります。

  • ユーザーが非自明な「面会」のために効果的に使用するためにbind1st/bind2nd/ptr_fun/mem_funの間の相互作用について多くのことを知っている必要があります - ブーストはこれらの問題の多くを修正しますが、誰もが昇圧を持っているわけではありません。
  • ユーザは、単なる単一のポイントのために独自の別のファンクタ(通常は構造体)を提供する必要があります。前記構造体は、ループを囲む関数内で宣言することができず、関連するコードの「非局所性」につながります。それは、ロジックを、関数の残りの部分のフローとインラインで読み込むこともありません
  • が、それは必ずしもうまくインライン、コンパイラに依存しない

上記のようFOREACHマクロがいくつか用意されています。あなたは境界テスト誤解しないだろう、std::for_eachよう

  • を(最後を1回繰り返すことはありません)
  • const_iterators一定コンテナ以上

非標準の「typeof」拡張が必要であることに注意してください。

典型的な使い方は次のようになります。

 
list< shared_ptr<Thing> > m_memberList; 
// later 
FOREACH(iter, m_memberList) 
{ 
    if ((*iter)->getValue() < 42) { 
     doSomethingWith(*iter); 
    } 
} 

私はこのマクロと完全に満足してないんだけど、それはSTL対応のデザインのように多くの経験なしで、特にプログラマのために、ここでは非常に貴重となっています。

(私は答えを更新します、長所/短所/欠陥を指摘すること自由に感じて下さい。)

+0

ハァッ、マクロにはいくつかの安全上の欠点がありません。それを少し更新します。もちろん、マクロ使用の通常の「短所」がすべて適用されます:繰り返し評価など。 – leander

+0

ああ。このループがend()を繰り返し評価するのを避けることを選択したことに注意する価値があります。あなたがループで何をしているかによって、それは賢明かもしれません。もちろん、コンテナの内容を反復処理するときに変更することは、常に難しい命題です。 – leander

+1

2013年にこれを読んで、C++で追加されたのは嬉しいです。そのマクロはうんざりです! – Ricky65

関連する問題