イテレータとジェネリック関数をよりよく保持しようとしています。私はcontainer1 < container2 <type> >
をcontainer3 <type>
に変換する関数を書いておくと便利だと思いました。たとえば、vector< deque<int> >
をlist<int>
に変換する必要があります。コンテナのコンテナをフラット化する汎用関数
すべてのコンテナのアクセスは、<algorithm>
の関数のように、イテレータを使用する必要があると考えました。ここで
私のコードです:
#include <iterator>
#include <algorithm>
// COCiter == Container of Containers Iterator
// Oiter == Output Iterator
template <class COCiter, class Oiter>
void flatten (COCiter start, COCiter end, Oiter dest)
{
using namespace std;
while (start != end) {
dest = copy(start->begin(), start()->end(), dest);
++start;
}
}
しかし、私は次のコードでそれを呼び出すようにしてみてください。
int main()
{
using namespace std;
vector< vector<string> > splitlines;
vector<string> flat;
/* some code to fill SPLITLINES with vectors of strings */
flatten(splitlines.begin(), splitlines.end(), back_inserter(flat));
}
私は巨大なC++テンプレート・エラー・メッセージを取得し、undefined reference to void flatten< ... pages of templates ...
私は私のコードは書くのが簡単すぎるように感じます。内側のコンテナのデータ型が出力コンテナのデータ型と確実に一致するようにするには、もっと多くのものが必要です。しかし、私は何をすべきかわかりません。
スタックにはイテレーターがなく、開始/終了機能はありません。あなたがスタックで動作するようにしたいのであれば、それは特別なケースでなければなりません。 –
これは本当です。私は質問を変えます。私は実際にスタックの互換性は必要ありません。ちょうど反復可能なコンテナ。 – japreiss