回答編集履歴

4

微修正

2018/03/06 09:12

投稿

Chironian
Chironian

スコア23272

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を使う一般的です。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
 

3

微修正

2018/03/06 09:12

投稿

Chironian
Chironian

スコア23272

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

ミス修正

2018/03/06 09:08

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
  std::vector<std::string> aList;
122
122
 
123
- aList.emplace_back("abcdefghijklmnopqrstuvwxyz");
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
- emplace_back呼び出しで、"abcdefghijklmnopqrstuvwxyz"によりstd::string型の一時オブジェクトが生成されてemplace_back()関数に渡されます。
137
+ のpush_back呼び出しで、"abcdefghijklmnopqrstuvwxyz"によりstd::string型の一時オブジェクトが生成されてpush_back()関数に渡されます。
138
138
 
139
- emplace_back()は右辺値を受け取るとムーブしますので、コピーを最小限にしてくれます。(実際には、このケースでは「コピー省略」が機能するかもせんが、文法上はムーブです。)
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 emplace_back_move(T& rhs);
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.emplace_back_move(str);
163
+ aList.push_back_move(str);
164
164
 
165
165
  }
166
166
 

1

あまり適切でない説明だったので一部削除

2018/03/06 09:04

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -168,67 +168,7 @@
168
168
 
169
169
 
170
170
 
171
- これだけでもなかなか嫌なものです。(なお、VC++は「独自拡張」と称してクラス型については左辺値参照で右辺値を受け取ることができます。)
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