回答編集履歴
4
微修正
test
CHANGED
@@ -136,7 +136,7 @@
|
|
136
136
|
|
137
137
|
のpush_back呼び出しで、"abcdefghijklmnopqrstuvwxyz"によりstd::string型の一時オブジェクトが生成されてpush_back()関数に渡されます。
|
138
138
|
|
139
|
-
C++11以降のpush_back()は右辺値を受け取るとムーブしますので、コピーを最小限にしてくれます。(C++11ではemplace_backを使う
|
139
|
+
C++11以降のpush_back()は右辺値を受け取るとムーブしますので、コピーを最小限にしてくれます。(C++11ではemplace_backを使うことが多いです。しかし、yohhoyさんご指摘の通り、この例示にはemplace_backでは適切な説明にならないのでpush_backに変更しました。)
|
140
140
|
|
141
141
|
|
142
142
|
|
3
微修正
test
CHANGED
@@ -136,7 +136,7 @@
|
|
136
136
|
|
137
137
|
のpush_back呼び出しで、"abcdefghijklmnopqrstuvwxyz"によりstd::string型の一時オブジェクトが生成されてpush_back()関数に渡されます。
|
138
138
|
|
139
|
-
push_back()は右辺値を受け取るとムーブしますので、コピーを最小限にしてくれます。(C++11ではemplace_backを使うのが一般的です。yohhoyさんご指摘の通り、この例示にはemplace_backでは適切な説明にならないのでpush_backに変更しました。)
|
139
|
+
C++11以降のpush_back()は右辺値を受け取るとムーブしますので、コピーを最小限にしてくれます。(C++11ではemplace_backを使うのが一般的です。yohhoyさんご指摘の通り、この例示にはemplace_backでは適切な説明にならないのでpush_backに変更しました。)
|
140
140
|
|
141
141
|
|
142
142
|
|
2
ミス修正
test
CHANGED
@@ -120,7 +120,7 @@
|
|
120
120
|
|
121
121
|
std::vector<std::string> aList;
|
122
122
|
|
123
|
-
aList.
|
123
|
+
aList.push_back("abcdefghijklmnopqrstuvwxyz");
|
124
124
|
|
125
125
|
for (auto& str : aList)
|
126
126
|
|
@@ -134,9 +134,9 @@
|
|
134
134
|
|
135
135
|
```
|
136
136
|
|
137
|
-
の
|
137
|
+
のpush_back呼び出しで、"abcdefghijklmnopqrstuvwxyz"によりstd::string型の一時オブジェクトが生成されてpush_back()関数に渡されます。
|
138
138
|
|
139
|
-
|
139
|
+
push_back()は右辺値を受け取るとムーブしますので、コピーを最小限にしてくれます。(C++11ではemplace_backを使うのが一般的です。yohhoyさんご指摘の通り、この例示にはemplace_backでは適切な説明にならないのでpush_backに変更しました。)
|
140
140
|
|
141
141
|
|
142
142
|
|
@@ -146,7 +146,7 @@
|
|
146
146
|
|
147
147
|
```C++
|
148
148
|
|
149
|
-
void
|
149
|
+
void push_back_move(T& rhs);
|
150
150
|
|
151
151
|
```
|
152
152
|
|
@@ -160,7 +160,7 @@
|
|
160
160
|
|
161
161
|
std::string str("abcdefghijklmnopqrstuvwxyz");
|
162
162
|
|
163
|
-
aList.
|
163
|
+
aList.push_back_move(str);
|
164
164
|
|
165
165
|
}
|
166
166
|
|
1
あまり適切でない説明だったので一部削除
test
CHANGED
@@ -168,67 +168,7 @@
|
|
168
168
|
|
169
169
|
|
170
170
|
|
171
|
-
|
171
|
+
なかなか嫌なものです。(なお、VC++は「独自拡張」と称してクラス型については左辺値参照で右辺値を受け取ることができます。)
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
更に、同じ文字列を複数pushしたい時は、次のような関数を用意します。
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
```C++
|
180
|
-
|
181
|
-
void emplace_back(T const& rhs);
|
182
|
-
|
183
|
-
```
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
そして、ヒープ獲得を最小限にするためには、続けて次のように呼び出します。(const参照は左辺値、右辺値共に受け取れます。)
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
```C++
|
192
|
-
|
193
|
-
{
|
194
|
-
|
195
|
-
std::string str("abcdefghijklmnopqrstuvwxyz");
|
196
|
-
|
197
|
-
aList.emplace_back_move(str);
|
198
|
-
|
199
|
-
}
|
200
|
-
|
201
|
-
{
|
202
|
-
|
203
|
-
std::string str("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
|
204
|
-
|
205
|
-
aList.emplace_back(str);
|
206
|
-
|
207
|
-
aList.emplace_back(str);
|
208
|
-
|
209
|
-
aList.emplace_back_move(str);
|
210
|
-
|
211
|
-
}
|
212
|
-
|
213
|
-
```
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
右辺値参照のお陰で次のように書いても、重たいヒープ獲得が無駄に発生しないってありがたいものです。
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
```C++
|
222
|
-
|
223
|
-
aList.emplace_back("abcdefghijklmnopqrstuvwxyz");
|
224
|
-
|
225
|
-
aList.emplace_back("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
|
226
|
-
|
227
|
-
aList.emplace_back("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
|
228
|
-
|
229
|
-
aList.emplace_back("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
|
230
|
-
|
231
|
-
```
|
232
172
|
|
233
173
|
|
234
174
|
|