回答編集履歴

3

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

2018/11/14 03:14

投稿

kazto
kazto

スコア7196

test CHANGED
@@ -59,3 +59,61 @@
59
59
  ただし、上記では const int * を受け取るコンストラクタが無いよ、とエラーになります。
60
60
 
61
61
  どうやるのが正しいかな、むむむ。
62
+
63
+
64
+
65
+ ---
66
+
67
+ C++11以上に限りますが、std::begin, std::endを使う方法が一番お望みのものに近いかも知れません。
68
+
69
+
70
+
71
+ ```C++
72
+
73
+ #include <vector>
74
+
75
+ #include <iterator>
76
+
77
+
78
+
79
+ struct Data
80
+
81
+ {
82
+
83
+ int id;
84
+
85
+ std::vector<int> vec;
86
+
87
+
88
+
89
+ Data(int i, int *b, int *e) : id(i), vec(b, e) {};
90
+
91
+ };
92
+
93
+
94
+
95
+ int main(void)
96
+
97
+ {
98
+
99
+ int static_array[] = {1,2,3};
100
+
101
+ struct Data d(1, std::begin(static_array), std::end(static_array));
102
+
103
+
104
+
105
+ std::cout << d.vec[2] << std::endl;
106
+
107
+ return 0;
108
+
109
+ }
110
+
111
+ ```
112
+
113
+ 一旦変数に代入しなければいけないのもイマイチですが、これくらいが限界かなと。
114
+
115
+
116
+
117
+ また、コンストラクタを経由する必要があります。
118
+
119
+ 代入演算子では引数が1つしか取れない一方、vectorにはbeginとendの2つを渡す必要があるため。

2

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

2018/11/14 03:14

投稿

kazto
kazto

スコア7196

test CHANGED
@@ -21,3 +21,41 @@
21
21
  vecはvecter<int>型であるので、push_backの引数はint型である必要がある。
22
22
 
23
23
  一方で{1,2,3}と配列を代入しようとしているため、型が違う、と怒られている状態です。
24
+
25
+
26
+
27
+ ---
28
+
29
+
30
+
31
+ もうクローズしてしまいましたが、まだできないと断じるのは早いかと思います。
32
+
33
+
34
+
35
+ 素のvectorは静的配列`{...}`の初期化子、代入演算子を持っています。
36
+
37
+ これと同じことを、構造体のコンストラクタなり代入演算子なりに宣言することで、一気に代入も可能なのではないかと思っています。
38
+
39
+
40
+
41
+ ```C++
42
+
43
+ struct Data
44
+
45
+ {
46
+
47
+ int id;
48
+
49
+ std::vector<int> vec;
50
+
51
+
52
+
53
+ Data(int i, const int v[]) : id(i), vec(v) {};
54
+
55
+ };
56
+
57
+ ```
58
+
59
+ ただし、上記では const int * を受け取るコンストラクタが無いよ、とエラーになります。
60
+
61
+ どうやるのが正しいかな、むむむ。

1

内容補足

2018/11/14 01:43

投稿

kazto
kazto

スコア7196

test CHANGED
@@ -17,3 +17,7 @@
17
17
  data[0].vec.push_back(3);
18
18
 
19
19
  ```
20
+
21
+ vecはvecter<int>型であるので、push_backの引数はint型である必要がある。
22
+
23
+ 一方で{1,2,3}と配列を代入しようとしているため、型が違う、と怒られている状態です。