質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

2097閲覧

C++でリストにリストを挿入し,それをprintしたい

anuthys

総合スコア16

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/10/23 06:30

編集2018/10/23 07:01

C++初心者です.
最近,やってみたいことがあってC++を勉強し始めました.
普段はPythonを使って研究活動に励んでいます.

実現したいこと

本題です.
Pythonにおいて,リストにリストを挿入する際,

python

1>>> lst = [1, 2, 3] 2>>> lst2 = [3, 4] 3>>> lst.append(lst2) 4[1, 2, 3, [3, 4]]

と書くことができると思うのですが,C++でこのようなリストは実装することは可能なのでしょうか.
また,リストの中身を

[1, 2, 3, [3, 4]]

と表示することは可能なのでしょうか.

試してみたこと

c++

1#include <iostream> 2#include <fstream> 3#include <list> 4 5int main(void) { 6 int len = 3; // original list size 7 8 list<int> lst; 9 for (int i = 0; i < len; i++) { 10 lst.push_back(i); 11 } // filled an array from 1 to 3 12 13 list<int> lst2 = {3, 4}; // want to add 14 15 lst.splice(lst.end(), lst2); 16 cout << lst.size() << endl; 17 18 /* want to print */ 19 20 return 0; 21}

listがもつspliceメソッドを使用してリスト同士を連結するという実装を試してみたのですが,サイズを確認してみたところ,5となったので,

[1, 2, 3, 3, 4]

となっていると考えられます.
これでは使用仕様を満たしていないので,困り果ててしまいました.

補足情報

  • C++11以上の実装でも構いませんし,ライブラリの仕様についても特に制約はないものと考えていただいて大丈夫です.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

リストのリストにする。

C++ では型の異なるものを同じ配列で保持するということは基本的にできませんので、[[1], [2], [3], [3, 4]] のようにリストのリストという形であれば可能です。

cpp

1#include <iostream> 2#include <vector> 3 4int main() 5{ 6 std::vector<std::vector<int>> vec; 7 vec.push_back(std::vector<int>{1}); 8 vec.push_back(std::vector<int>{2}); 9 vec.push_back(std::vector<int>{3}); 10 std::vector<int> array = {1, 2, 3}; 11 vec.push_back(array); 12 13 for(const auto &v : vec) { 14 for(const auto &elem : v) 15 std::cout << elem << std::endl; 16 } 17}
1 2 3 1 2 3

boost::any を使う。

boost::any を使えば、任意の型を要素にとる配列を作れます。

cpp

1#include <iostream> 2#include <vector> 3 4#include <boost/any.hpp> 5 6int main() 7{ 8 std::vector<boost::any> vec; 9 vec.push_back(1); 10 vec.push_back(2); 11 vec.push_back(3); 12 13 std::vector<int> array = {1, 2, 3}; 14 vec.push_back(array); 15 16 for (const auto &v : vec) { 17 if (v.type() == typeid(int)) { 18 // int 型の場合 19 std::cout << boost::any_cast<int>(v) << std::endl; 20 } 21 else if (v.type() == typeid(std::vector<int>)) { 22 // std::vector<int> 型の場合 23 for (const auto &elem : boost::any_cast<std::vector<int>>(v)) 24 std::cout << elem << std::endl; 25 } 26 } 27} 28
1 2 3 1 2 3

投稿2018/10/23 06:52

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2018/10/23 06:55

c++17にはstd:anyがありますよ
tiitoi

2018/10/23 07:01

c++17 で標準ライブラリ入りしたのですね。 情報ありがとうございます。
guest

0

C++は静的型付き言語なので、listなどのデータ構造についても、「同じ型」のものをリストにすることしかできません。他言語にあるような「ルートクラス」もなければ、intはクラスと全く別の型であるということもあって、「共通な上位クラスで扱う」という手段も取れません。

ただし、外部ライブラリにはなりますが、boost::variantboost::anyといった、「多様な型を扱える型」というのがあって、用途や目的によってはこういうのを使うという手段もあります。

もっとも、C++では「データ構造に合わせて型を組む」というスタイルのほうが一般的なので、「リストをネストしたい」理由によっては、自分で組み立てたほうがいいかもしれません。

投稿2018/10/23 06:44

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

私もPython3を約1ヶ月勉強した程度ですがその後最近C++の勉強を始めました。
Python3で特に配列操作などで直感的に書けていたことが中々書けないのでその都度調べたり苦労してます。
std::vectorは多用することになると思うのでlistの変わりだと思って積極的に使ったほうが良いと思います。
逆にlistを使うのは挿入や削除が頻繁に起きる場合のみ程度で良いはずです。

[C++] STLの型の使い分け

以下出力も含めたサンプルですご参考までに。

C++

1#include <cstdio> 2#include <iostream> 3#include <iterator> 4#include <vector> 5 6int main() 7{ 8 std::vector<std::vector<int>> v1; 9 10 for (int i = 1; i <= 3; ++i) 11 { 12 v1.push_back({i}); 13 } 14 15 std::vector<int> v2 = {3, 4}; 16 17 v1.push_back(v2); 18 19 std::cout << "v1.size() : " << v1.size() << std::endl; 20 std::cout << "v2.size() : " << v2.size() << std::endl; 21 22 std::cout << "{"; 23 for (int i = 0; i < v1.size(); ++i) 24 { 25 std::cout << "{"; 26 for (int j = 0; j < v1[i].size(); ++j) 27 { 28 std::cout << v1[i][j]; 29 if (j != v1[i].size()-1) 30 { 31 std::cout << ","; 32 } 33 } 34 std::cout << "}"; 35 if (i != v1.size() - 1) 36 { 37 std::cout << ","; 38 } 39 } 40 std::cout << "}" << std::endl; 41 42 getchar(); 43 return 0; 44}
v1.size() : 4 v2.size() : 2 {{1},{2},{3},{3,4}}

投稿2018/10/23 07:45

編集2018/10/23 07:51
opyon

総合スコア1009

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anuthys

2018/10/23 07:59

Pythonでの記述と紐づけた説明がとてもわかりやすかたので,ベストアンサーに選ばせていただきました. std::vectorとlistの使い分けについてもとてもわかりやすかったです. ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問