如果我有一个指向矢量的指针,插入会使它无效

Seb*_*ian 2 c++ vector

假设我有以下代码:

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)具有之前插入的元素?

πάν*_*ῥεῖ 5

这会使指针无效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.只需使用具有自动内存分配的普通本地或成员变量.