我感兴趣的是,如果创建新的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?
}
答案 0 :(得分:11)
是。元素始终复制到STL容器中或从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~无载体
Erroap = 02-0304-231~无载体
答案 1 :(得分:9)
元素始终复制到STL容器中或从STL容器中复制出来。
虽然元素可能只是一个指针,但在这种情况下指针被复制但不复制基础数据
答案 2 :(得分: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));
}
答案 3 :(得分:0)
如果您希望移动数据,请使用std::swap_ranges
,但必须首先分配内存:
vector<T> v;
v.reserve(std::distance(beg, end));
std::swap_ranges(beg, end, v.begin());
答案 4 :(得分:0)
如果您不想要对象复制语义,则可以创建指向对象的向量,以便仅复制指针。但是,您必须确保指针在容器的生命周期内保持有效。