teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

std::begin,endについて追記

2018/11/14 03:14

投稿

kazto
kazto

スコア7196

answer CHANGED
@@ -28,4 +28,33 @@
28
28
  };
29
29
  ```
30
30
  ただし、上記では const int * を受け取るコンストラクタが無いよ、とエラーになります。
31
- どうやるのが正しいかな、むむむ。
31
+ どうやるのが正しいかな、むむむ。
32
+
33
+ ---
34
+ C++11以上に限りますが、std::begin, std::endを使う方法が一番お望みのものに近いかも知れません。
35
+
36
+ ```C++
37
+ #include <vector>
38
+ #include <iterator>
39
+
40
+ struct Data
41
+ {
42
+ int id;
43
+ std::vector<int> vec;
44
+
45
+ Data(int i, int *b, int *e) : id(i), vec(b, e) {};
46
+ };
47
+
48
+ int main(void)
49
+ {
50
+ int static_array[] = {1,2,3};
51
+ struct Data d(1, std::begin(static_array), std::end(static_array));
52
+
53
+ std::cout << d.vec[2] << std::endl;
54
+ return 0;
55
+ }
56
+ ```
57
+ 一旦変数に代入しなければいけないのもイマイチですが、これくらいが限界かなと。
58
+
59
+ また、コンストラクタを経由する必要があります。
60
+ 代入演算子では引数が1つしか取れない一方、vectorにはbeginとendの2つを渡す必要があるため。

2

内容追記(解決はしていません。。。)

2018/11/14 03:14

投稿

kazto
kazto

スコア7196

answer CHANGED
@@ -9,4 +9,23 @@
9
9
  data[0].vec.push_back(3);
10
10
  ```
11
11
  vecはvecter<int>型であるので、push_backの引数はint型である必要がある。
12
- 一方で{1,2,3}と配列を代入しようとしているため、型が違う、と怒られている状態です。
12
+ 一方で{1,2,3}と配列を代入しようとしているため、型が違う、と怒られている状態です。
13
+
14
+ ---
15
+
16
+ もうクローズしてしまいましたが、まだできないと断じるのは早いかと思います。
17
+
18
+ 素のvectorは静的配列`{...}`の初期化子、代入演算子を持っています。
19
+ これと同じことを、構造体のコンストラクタなり代入演算子なりに宣言することで、一気に代入も可能なのではないかと思っています。
20
+
21
+ ```C++
22
+ struct Data
23
+ {
24
+ int id;
25
+ std::vector<int> vec;
26
+
27
+ Data(int i, const int v[]) : id(i), vec(v) {};
28
+ };
29
+ ```
30
+ ただし、上記では const int * を受け取るコンストラクタが無いよ、とエラーになります。
31
+ どうやるのが正しいかな、むむむ。

1

内容補足

2018/11/14 01:43

投稿

kazto
kazto

スコア7196

answer CHANGED
@@ -7,4 +7,6 @@
7
7
  data[0].vec.push_back(1);
8
8
  data[0].vec.push_back(2);
9
9
  data[0].vec.push_back(3);
10
- ```
10
+ ```
11
+ vecはvecter<int>型であるので、push_backの引数はint型である必要がある。
12
+ 一方で{1,2,3}と配列を代入しようとしているため、型が違う、と怒られている状態です。