c++11のvector.emplace_backとstd::move()の使用
一、c++11のvector.emplace_back
しかし、vi.push_を少し修正します.back(「girl」)をvi.push_に変更back(CText(“girl”)); 問題は解決した.簡単に言えばempace_backとpush_backは,CTextを呼び出して構築するのを省く.
emplace_back:終了するコンテナに新しい要素を追加します.この素子は、その場で、すなわち、複製や移動操作が行われないように構成されている.二、std::move()
std::moveは、オブジェクトのステータスまたは所有権を1つのオブジェクトから別のオブジェクトに移行します.移行するだけで、メモリの移行やメモリコピーはありません.
stringクラスが付与またはコピー構造関数でchar配列を宣言してデータを格納し、元のstringのchar配列を構造関数によって解放する場合、aが一時変数であれば、上のコピー、構造は余分であり、一時変数aのデータを直接新しい変数の下に「移行」することができる.
#include
#include
#include
using namespace std;
class CText {
private:
string str;
public:
text(string s) :str(s) {
}
void show()const {
cout << str << endl;
}
};
int main()
{
vector vi;
vi.emplace_back("hey");
vi.front().show();
vi.push_back("girl");//
vi.back().show();
return 0;
}
しかし、vi.push_を少し修正します.back(「girl」)をvi.push_に変更back(CText(“girl”)); 問題は解決した.簡単に言えばempace_backとpush_backは,CTextを呼び出して構築するのを省く.
emplace_back:終了するコンテナに新しい要素を追加します.この素子は、その場で、すなわち、複製や移動操作が行われないように構成されている.二、std::move()
#include
#include
#include
#include
int main()
{
std::string str = "Hello";
std::vector<:string> v;
// , ,
v.push_back(str);
std::cout << "After copy, str is \"" << str << "\"
";
// , str, , str
v.push_back(std::move(str));
std::cout << "After move, str is \"" << str << "\"
";//After move, str is ""
std::cout << "The contents of the vector are \"" << v[0]
<< "\", \"" << v[1] << "\"
";
}
std::moveは、オブジェクトのステータスまたは所有権を1つのオブジェクトから別のオブジェクトに移行します.移行するだけで、メモリの移行やメモリコピーはありません.
stringクラスが付与またはコピー構造関数でchar配列を宣言してデータを格納し、元のstringのchar配列を構造関数によって解放する場合、aが一時変数であれば、上のコピー、構造は余分であり、一時変数aのデータを直接新しい変数の下に「移行」することができる.