std :: vector的拷贝构造函数如何运作?

cha*_*adb 10 c++ string vector std

std::vector<std::string>在调用以下代码时如何初始化自身

std::vector<std::string> original;
std::vector<std::string> newVector = original;
Run Code Online (Sandbox Code Playgroud)

这似乎好像拷贝构造函数会被调用的std::vector<std::string> new过程中newVector = original,却怎么都std::string带来了内部的orginal?它们是复制品还是新品std::string?内存newVector[0]也是如此original[0].

我问的原因是我做了以下事情

#include <vector>
#include <string>
using namespace std;

vector<string> globalVector;

void Initialize() {
    globalVector.push_back("One");
    globalVector.push_back("Two");
}

void DoStuff() {
    vector<string> t = globalVector;
}

int main(void) {
    Initialize();
    DoStuff();
}
Run Code Online (Sandbox Code Playgroud)

t将超出DoStuff(在非优化版本中)的范围,但是如果它t只是填充了指向std::strings in的指针globalVector,可能会调用析构函数并std::string删除所使用的内存,那么globalVector[0]填充垃圾std::string后会DoStuff是叫什么名字?

一个坚果壳,我基本上问,当std::vector调用复制构造函数时,里面的元素是如何被复制的?

Dar*_*con 18

std::vector大多数其他标准库容器按值存储元素.在插入时或复制容器时复制元素.std::string就您的使用情况而言,它还维护自己的数据副本.

  • 大多数==全部. (3认同)
  • @thb`std :: string`只是一个容器的排序,它被限制为"类似char的类型"(即它不能存储其他容器),并且由于多线程很普遍,因此不推荐使用copy-on-write. (3认同)
  • @BenjaminLindley:就容器的用户而言,你是对的.但是,正如您最有可能知道的那样,Stroustrup提醒我们一些容器,比如`std :: string`,可能会懒散地复制数据*,这意味着实际的复制操作可能不会在内部完成,直到其中一个字符串(原始的或副本)以要求它完成的方式使用.无论如何,我认为回答者在技术上是正确的,在这种情况下说*大多数*,特别是在他使用资格的方式. (2认同)
  • @chadb:是的,它们是包含独立元素的独立容器.恰好恰好具有语义相同的内容. (2认同)