私はvector<Bla> blaVec
を宣言し、関数を書く:C++少ない冗長container.startを渡すの代替()とcontainer.end()
template<typename Iterator>
void doSomething(Iterator first, Iterator last) { ... }
その後、私はblaVec
にこの関数を呼び出す:
doSomething(blaVec.begin(), blaVec.end());
しかし、私は本当にdoSomething(blaVec)
のような短いものを望んでいますが、関数定義にvector
を指定する必要はありません。基本的には、最初のイテレータだけを指定する良い標準的な方法、あるいはBoost.Rangeによって行われる範囲の[begin、end]イテレータを指定する方法があります。
私はアルゴリズムの男ですから、あまりにも一般的な複雑なソリューションには行きたくありません。私の人生のほとんどは、私はこのような関数を書いた:
void doSomething(vector<int> & bla) { ... }
しかし、これらの日、私は頻繁に少しより一般的な解決策は、私が一緒に行った理由である、のために呼ばれたのでlist
とdeque
とvector
で動作doSomething
を書きますイテレータ。しかし、それはあまりにも冗長な解決策であるようです。何を指示してるんですか?
- のdoSomething(ベクトル& BLA){...}
- doSomethingの(最初のイテレータ、イテレータ最後){...}
- のdoSomething(/ *いくつかのレンジデータ構造* /){.. 。}
あなたはBoost.Rangeと言います。遅延評価などの、あらゆる種類の面白い機能も備えています。 –
私はそれがどれほど一般的に使用されているのかよくわかりませんでした。私はソフトウェア設計の面ではなく、アルゴリズムに焦点を当てているので、多くのプログラマーが使用している技術を使用するのが好きです。私はソフトウェアエンジニアリングの最先端にいるのが好きではありません。時折、シンクになることがあります。 –
追加の冗長性は最小限ですが、イテレータ範囲の柔軟性ははるかに優れています。さらに、全範囲をトラバースする必要がある場合は、 'std :: for_each'がそのために設計されています。 –