vector::push_back() 元素的生命周期

Joh*_*ick 4 c++ stl

我想确认我对已push_back()在 .ed 上编辑的对象的生命周期的理解std::vector。我读到的内容是向量中的元素是副本。那么,下面的用法可以吗?具体来说,变量 s 是否位于f2()an 的不同实例中std::string,而不是push_back()'ed 中的变量f1(),因此可以安全使用?

void f1(std::vector<std::string>* pv) {
    std::string s = "hi";               
    pv->push_back(s);
}

void f2(void) {
    std::vector<std::string> v;
    f1(&v);
    for (size_t i = 0; i < v.size(); ++i) {
        std::string s = v.at(i);
        std::cout << s;
    }
}
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 5

对,那是正确的。s在 期间存储字符串的副本push_back。检查文档了解详细信息。它指出:

void push_back ( const T& x );
Run Code Online (Sandbox Code Playgroud)

在向量末尾当前最后一个元素之后添加一个新元素。这个新元素的内容被初始化为 x 的副本。

参数
x
要复制到新元素的值
T是第一个模板参数(向量中存储的元素的类型)。


fre*_*low 5

std::string s = "hi";               
pv->push_back(s);
Run Code Online (Sandbox Code Playgroud)

请注意,这是不必要的低效。由于s是左值,push_back因此确实会复制。如果您说相反,C++0x 编译器可以用movepv->push_back(std::string("hi"))替换副本,因为是右值。你甚至可以说:std::string("hi")

pv->emplace_back("hi");
Run Code Online (Sandbox Code Playgroud)

就地构造字符串对象。无需复制或移动。