c++11のvector.emplace_backとstd::move()の使用


一、c++11のvector.emplace_back
#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のデータを直接新しい変数の下に「移行」することができる.