假设我有以下代码:
std::vector<std::string>* vs = new std::vector<std::string>;
vs->push_back(string("Hello"));
vs->push_back(string("World"));
Run Code Online (Sandbox Code Playgroud)
这会使指针无效vs吗?或者更具体地说,
void doSomething(std::vector<std::string>* vs) {
vs->push_back(string("thisWasATriumph"));
if (vs->size() < 3) {
doSomething(vs);
}
}
int main() {
std::vector<std::string>* vs = new std::vector<std::string>;
doSomething(vs);
std::cout << vs->back() << endl;
}
Run Code Online (Sandbox Code Playgroud)
调用是否doSomething(vs)具有之前插入的元素?
这会使指针无效
vs吗?
不,它不会使指向矢量本身的指针无效(在大多数情况下BTW 1都非常愚蠢).
您可能会对任何std::vector<>::iterator值的失效感到困惑,如文档中所述:
如果new size()大于capacity(),那么所有迭代器和引用(包括过去的迭代器)都将失效.否则只有过去的结束迭代器无效.
对doSomething(vs)的调用是否具有之前插入的元素?
是.
简单地使用引用可能更好,并且根本不使用new:
void doSomething(std::vector<std::string>& vs) {
// ^
vs.push_back(string("thisWasATriumph"));
if (vs.size() < 3) {
doSomething(vs);
}
}
Run Code Online (Sandbox Code Playgroud)
int main() {
std::vector<std::string> vs; // = new std::vector<std::string>;
// ^^^^^^^^^^ No need or this
doSomething(vs);
std::cout << vs->back() << endl;
}
Run Code Online (Sandbox Code Playgroud)
1)动态分配a几乎没有优势std::vector.只需使用具有自动内存分配的普通本地或成员变量.