• ベストアンサー

STLでコンテナにコンテナを格納

STLを用いてコンテナにコンテナを格納する事は出来るのでしょうか。 vectorにvectorを格納したり、listにvectorを格納したりといったニーズは普通にあると思うのですがいかがでしょう。

質問者が選んだベストアンサー

  • ベストアンサー
  • i-kujou
  • ベストアンサー率50% (13/26)
回答No.1

std::vector<std::list<std::map<std::string,std::vector<int> > > > v; とか普通に定義できますよ。 気をつけなければいけないのは、> を連続させてはいけないということです。 例えば std::vector<std::list<int>> と記述すると、コンパイラによっては最後の >> を operator>> と認識しようとしてコンパイルエラーになってしまいます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

#1 の通りなんですが, 「コンパイラによっては」だけは間違いです. 「できるだけ長いトークンを作る」ことになっていますから, コンパイラによらず >> を 1個のトークンと認識しなければなりません (だからコンパイルエラーになる). Java のジェネリックなら >> でいいんですけどね. まあ, これはジェネリックパラメータとしてクラスしか使えないという制限によるものなんですが.

関連するQ&A

  • 参照型を格納できるコンテナについてなど

    ちょっと長文です。下のほうに質問があります。 STLのvectorコンテナを使用しているのですが、 困った事態が発生しています。 自分は、参照型を要素として、持たしたいのですが、 持たすことができません。 なにやら調べてみたところ、STLのコンテナクラスというのは 基本的に「値ベースのコンテナ」らしく、「参照ベースのコンテナ?」 としてコンテナを使うには、ポインタ型を格納して下さい。との ことでした。 ただし、この方法は2重deleteが発生する危険性を孕んでいるので、 Boostのなんかのポインタークラス?のようなものを使えば、 そのような問題に悩まされることないですよー。とありました。 ここで問題なのは、 ・Boostを扱えるだけの知識がない。 ・そもそもBoostを使えるまで環境設定できる自信がない。 ということです。 そのため、普通のポインタを使って実装しようと思うのですが、 そして上記のような問題が出てくるにつれ自分の中では 次のような疑問点が出てきました。 ●質問(1) ・なんで参照型を格納できるコンテナがないのよ!  本当はあったりするんだけども、自分が知らないだけ? ●質問(2) ・関数間でオブジェクトを渡すときには、パフォーマンスとかも  考慮してもconstキーワードを使いつつの参照渡しがよい。と  Effective C++か何かで読んだのですが、コンテナに格納する  場合にはこれは有効ではないのか?  また、オブジェクトは、基本的には、やたらめったら  コピーするものではなく、一つオブジェクト用のメモリ領域を  作ったらそれを流用(ポインタ・参照を使って参照する)した方が、  作り的にきれいな気がするのですが、なにか方針とかあったりする  のでしょうか? 以上長くなってしまいましたが、よろしくお願いいたします。

  • クラスとSTLコンテナについて

    使用しているコンパイラおよびSTLはVisual Studio 2008 Professional付属のものです C++にてSTLのコンテナにクラスオブジェクトを入れて使用しようと考えています しかし、オブジェクトをコンテナへ挿入・削除した際に何度もコピーコンストラクタが呼び出されているのを確認しました コンテナ内に直接、比較的大きめのリソースを持つオブジェクトを多数入れた場合、オブジェクトのコピーだけでパフォーマンスに影響が出るのではないか、と感じました これはコンテナを使う上では許容しないといけないことなのでしょうか? クラスオブジェクトを直接ではなく、ポインタで入れた場合は、コンテナ削除時にデストラクタが呼ばれないため、クラスポインタとコンテナの組み合わせはしてはいけないと認識しています クラスとコンテナを組み合わせて使用する場合は、boostのshard_ptrを使用するのが、パフォーマンスを考慮する上では最も良い選択なのでしょうか? それとも、それ以外の常識的な使用方法があるのでしょうか? 回答よろしくお願いします

  • 順位キューのコンテナにvectorを使える理由

    C++のSTLについてです。 vectorにはfrontやpop_frontがないのにどうして順位キューのコンテナとして使えるのでしょうか? よろしくお願いします。

  • STLについて

    VC++6を使っています。ベクタを戻り値とするプログラムを書いています。効率が悪く感じるのですが、STL?ではこういうやり方は正しいのでしょうか? また、一般的にSTLで引数や戻り値を扱う場合、どのようなタイプ(string?)を使えば、効率よく、きれいなプログラムが書けるのでしょうか? class A{ ... } vector<A> test(void){ vector<A> ret; for (int i = 0; i < 1000; i++){ ret.push_back( A(i) ); } return ret; } vector<A> a = test(); // 巨大なコンテナが返され、aにコピーされる? ※基本的に戻り値の仕組みが理解不足です。 char *の場合は、char配列のポインタが返され、新たな変数にポインタ値がコピーされるという解釈で結構ですか? char * sample(void){ char *p = new [1000]; return p; } char *q = sample();

  • C++ 多態とstlのコンテナについて

    以下のように、継承関係を作ります。 --------------------------------------- #include <iostream> #include <list> #include <vector> using namespace std; struct Base { virtual ~Base() = 0; }; Base::~Base() {} struct Sub1 : Base { int v; Sub1(int i) { v = i; } }; struct Sub2 : Base { double v; Sub2(double d) { v = d; } }; --------------------------------------- この場合、 Sub1, Sub2 のインスタンスをなにかコンテナに入れたい場合は、一般的には以下のように書けばいいのでしょうか? ---------------------- list<Base*> l; vector<Base*> v; Sub1 s1(3); Sub2 s2(4.4); l.push_back(&s1); l.push_back(&s2); v.push_back(&s1); v.push_back(&s2); ---------------------- list<Base>, vector<Base>も試しましたが list<Base> は宣言したところで vector<Base> は push_back() したところで コンパイルエラーになりました。 これは、こういうものなのでしょうか? むしろ、struct(もしくはclass)の書き方を変えたりすれば、問題なくなったりするのでしょうか? 全体としては、C++は参照などあって、どいう場合にポインタ使うべきなのかそういう部分に混乱しているような気もします。 いろいろ質問してしまって、申し分けないですがなにか ひとつでも答えられるものがあれば回答してもらえると ありがたいです。

  • STLの質問です

    今、STLの勉強中です。 STLのキューとか、ベクトルとか動的にメモリの割り当てをしてくれますよね。その後、メモリを自動的に解放しますか?もし、解放するであれば、どういうタイミングで解放しますか? 回答の方、お願いします。

  • STLのvectorのデフォルトの予約要素数は?

    STLのvectorコンテナの、あらかじめメモリに確保される要素数はreserve関数で変更できますが、reserve関数を使わない時のデフォルトの予約要素数っていくつかご存知の方いますか?

  • ATLとSTLの違いは何でしょうか?

    ATLとSTLの違いは何でしょうか? STLでもリスト構造(線形リスト、[双方向リスト]) #include <list>があるみたいですが・・・ STLはC++の標準テンプレートライブラリ(そのまま)と理解しています。 あと、ActiveXとALTの違いも知りたいです。 極論しますが、ActiveXとはOCXを作ることでしょうか?

  • C++のSTLのvector

    C++のSTLのvectorのerase()で、落ちてしまいます。 vectorのサイズを確認したとところ、!=0です。 原因が何か知りたいので、考えられる原因を教えてください。 宜しくお願い致します。

  • STLのlistで重複するものだけを取り出す方法

    C++でVC++7.0を使用してプログラミングを学んでます。 ひとつハマっているのですが…、 STLのlistを利用して、重複するデータのみを一つにしたlistにしたいです。 例えば std::list<std::string> [1] bbb [2] aaa [3] bbb [4] ccc [5] eee [6] ddd [7] bbb [8] ccc と格納されたlistがあった場合に、 [1] bbb [2] ccc と2つ以上あるデータを1つのみ格納するようにしたいです。 重複するデータを省く処理なら思いつくのですが… (.sort()で重複するデータを並べ、.unique()で重複するデータを削除する) 上記のようなことは可能でしょうか? 何か有効な案がありましたら是非ご教授下さい!

専門家に質問してみよう