1

编码:

// test2.cpp

#include <vector>
#include <iostream>

struct test_class
{
    test_class() = default;

    test_class(const test_class& t)
    {
        std::cout << "Copied" << std::endl;
    }
};

int main()
{
    test_class a;
    std::vector<test_class> v;

    for (int i = 0; i < 5; ++i) {
        v.push_back(a);
        std::cout << std::endl;
    }
}

行为:

$ g++ --version | grep g++
g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
$ g++ -std=c++11 test2.cpp
$ ./a.out
Copied

Copied
Copied

Copied
Copied
Copied

Copied

Copied
Copied
Copied
Copied
Copied

每个都push_back执行“未定义”数量的副本(必须执行一个副本)。

这里发生了什么?

4

2 回答 2

3

向量像数组一样分配连续的内存。如果内存末尾没有更多空间,则必须重新分配整个向量。在此之后,它会将元素从旧位置复制到新位置并删除旧位置。

您可以将其初始化为能够容纳至少 5 个元素,因此在您的示例中不会有内存分配和复制:

std::vector<test_class> v(5);
于 2012-12-21T12:42:35.897 回答
1

Apush_back可能会导致其vector增长超出其分配的存储空间,从而导致重新分配,从而导致内容被复制。

于 2012-12-21T12:36:24.863 回答