I want to confirm what I think I understand about the lifetime of objects which have been push_back()'ed on an std::vector. What I read says that the elements in the vector are copies. So, is the usage below OK? Specifically, is the variable s in f2() a different instance of an std::string than the one that is push_back()'ed in f1(), and thus safe to use?
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;
}
}
Yes that is correct. A copy of string s gets stored during push_back. Check the doccumentation for detail. It states:
void push_back ( const T& x );
Adds a new element at the end of the vector, after its current last element. The content of this new element is initialized to a copy of x.
Parameters
x
Value to be copied to the new element.
T is the first template parameter (the type of the elements stored in the vector).
std::string s = "hi";
pv->push_back(s);
Note that this is unnecessarily inefficient. Since s is an lvalue, push_back will indeed make a copy. If you say pv->push_back(std::string("hi")) instead, a C++0x compiler can replace the copy with a move, because std::string("hi") is an rvalue. You could even say:
pv->emplace_back("hi");
to construct the string object in place. No copy or move necessary.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With