私はこの問題をstackoverflowで見つけることができません。しかし、私は人々がどのようにSTLを使うのか疑問に思っています。コード例とトリック多く、長年にわたって取得/ヒント/主に使用例...そしておそらく落とし穴...最も使用されるSTLアルゴリズム、述語、イテレータ
はのは、それを共有しましょう...
解答ごとに1つのチップは... -
を編集すると、それがダウンボックスの原因となるような悪い質問ですか?
私はこの問題をstackoverflowで見つけることができません。しかし、私は人々がどのようにSTLを使うのか疑問に思っています。コード例とトリック多く、長年にわたって取得/ヒント/主に使用例...そしておそらく落とし穴...最も使用されるSTLアルゴリズム、述語、イテレータ
はのは、それを共有しましょう...
解答ごとに1つのチップは... -
を編集すると、それがダウンボックスの原因となるような悪い質問ですか?
私は、ループからイテレータを使って入力をプログラムに分割するまで、私のプロジェクトのほとんどすべてで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>
で定義された様々な他のアルゴリズムです。
ベクトルを使用してポインタ+新しいものを置き換えます。それは巨大です。
ほとんどの有用なアルゴリズム(私見) - のstd :: for_each
私のお気に入りである文字列へのストリーミング何かを変更するには、次その後
template <class TYPE> std::string Str(const TYPE & t) {
std::ostringstream os;
os << t;
return os.str();
}
:あり
string beast = Str(666);
boost :: lexical_cast:P –
オリジナルの質問を参照してください - ブーストは許可されていません –
しかし、それはとにかくlexical_castのソースです。 –
ほとんどのSTLアルゴリズム、述語、イテレータは使用されません。これは、C++言語で最もよく使用される演算子が何であるかを尋ねるようなものです。あなたは何度も何を使用しますか、operator+
またはoperator-
? if
〜while
を好むですか?またはthrow
にするか?
すべてを使用する必要があります。
PS:このような質問をする前に、Scott MeyersがEffective STLを読むことをお勧めします。
「あなたのお気に入り/最も使用したブラシは何ですか? :)
あなたがそれが役に立たないことを暗示しているなら、私は同意しません。彼らは彼らが使用する原材料も気にしています。表現主義者は大きなブラシを使って荒いストロークを行い、現実の画家は非常に細かいものを使用し、鉛筆などを使用します。プログラミングでも同様の違いがあります。 – Frank
私は、STLにはさまざまな目標のためのさまざまなツールがあることを意味しました。我々の現在の仕事に依存して、私が必要としたツールは何かを比較することはできません。 – bayda
私は画家です...プログラマーです。私は、画家が頻繁に好きなブラシ、ツール、テクニックについて話し合っていると伝えます。 – Benj
私はその時に達成しようとしていたものの中で最も良い仕事をしたアルゴリズム/述語/イテレータが好きで、あるいは最もよく使われていることを思い出すことはできません。
私はベクターが大好きです。 C++の配列はであったはずです。私はリアルタイムの仕事をたくさんしています。意思決定を必要としない人は、リストを好むかもしれません。
ちょうど誰もがストリングから騒ぎを使用します。
ここでもVS6を使用しています(複雑なテンプレートの解析はできません)ので、アルゴリズムを使用することはあまりありません。それは間もなく終わります。
functional
もの:何らかの理由で1が結合を後押しするためのアクセス権を持っていない場合などbind1st
、bind2nd
、mem_fun
、equal_to
は、かなり便利です。
あなたのチームのコーディングスタイル、プロジェクトの種類、およびその他の未知の要因によって大きく左右されます。
私は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.
}
これは本当に素晴らしいです!このオプションについて知りませんでしたありがとう! – petric
以下は、やや「悪」であるが、それは多くのバグから私たちを救いました。
(更新、@ 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
よう
const_iterators
一定コンテナ以上非標準の「typeof」拡張が必要であることに注意してください。
典型的な使い方は次のようになります。
list< shared_ptr<Thing> > m_memberList; // later FOREACH(iter, m_memberList) { if ((*iter)->getValue() < 42) { doSomethingWith(*iter); } }
私はこのマクロと完全に満足してないんだけど、それはSTL対応のデザインのように多くの経験なしで、特にプログラマのために、ここでは非常に貴重となっています。
(私は答えを更新します、長所/短所/欠陥を指摘すること自由に感じて下さい。)
私はこの質問は本当に便利。しかし、無駄な答えに襲われています...貢献したすべての人に+1。 – AndreasT