4

std::vector如果创建一个新的(或调用它的assign方法)会创建数据的副本,我很感兴趣?

例如,

void fun(char *input) {
    std::vector<char> v(input, input+strlen(input));
    // is it safe to assume that the data input points to was COPIED into v?
}
4

5 回答 5

11

是的。元素总是被复制进或复制出 STL 容器。(至少在 C++0x 中添加移动语义之前)

编辑:这是您可以测试复制自己的方法:

#include <vector>
#include <iostream>

class CopyChecker
{
public:
    CopyChecker()
    {
        std::cout << "Hey, look! A new copy checker!" << std::endl;
    }
    CopyChecker(const CopyChecker& other)
    {
        std::cout << "I'm the copy checker! No, I am! Wait, the"
            " two of us are the same!" << std::endl;
    }
    ~CopyChecker()
    {
        std::cout << "Erroap=02-0304-231~No Carrier" << std::endl;
    }
};

int main()
{
    std::vector<CopyChecker> doICopy;
    doICopy.push_back(CopyChecker());
}

输出应该是:

你看!一个新的副本检查器!
我是副本检查员!不,我是!等等,我们两个是一样的!
Erroap=02-0304-231~No Carrier
Erroap=02-0304-231~No Carrier

于 2010-07-09T03:41:01.590 回答
9

元素总是被复制进或复制出 STL 容器。

虽然元素可能只是一个指针,但在这种情况下,指针被复制而不是底层数据

于 2010-07-09T03:42:10.117 回答
1

关于移动语义,如果您愿意,可以通过以下方式移动 C++0x 中的内容:

void fun_move(char *input)
{
    std::vector<char> v;
    auto len = strlen(input);
    v.reserve(len);
    std::move(input, input+len, std::back_inserter(v));
}
于 2010-07-09T09:01:21.630 回答
0

如果您希望移动数据,请使用std::swap_ranges,但您必须先分配内存:

vector<T> v;
v.reserve(std::distance(beg, end));
std::swap_ranges(beg, end, v.begin());
于 2010-07-09T09:20:06.530 回答
0

如果您不希望对象复制语义,那么您可以创建一个指向对象的向量,以便仅复制指针。但是,您必须确保指针在容器的生命周期内保持有效。

于 2010-07-09T12:34:46.667 回答