是否可以将指针浅复制到vector? 这是我的代码:
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> foo = {"apple", "melon", "kiwi"};
std::string *argv = foo.data();
size_t argc = foo.size();
std::vector<std::string> boo(argv, argv+argc);
}
boo
是否浅拷贝?
初始化boo
比进行std::vector<std::string> boo(foo);
更快吗?
答案 0 :(得分:3)
std::vector
对自己的缓冲区拥有唯一的所有权。该缓冲区不能与其他向量共享。因此,std::vector
类不提供“浅复制”的方法,除非将所有权转移到另一个std::vector
,在这种情况下,源std::vector
将不再拥有传输的缓冲区。这种所有权转移发生在移动构造函数或移动赋值运算符中。
已经编写了除标准std::vector
之外的其他容器实现,它们确实实现了“写时复制”语义,即在修改副本之前不会复制元素。
std::vector<std::string> boo(argv, argv+argc)
根据vector文档复制范围内的元素。它不比直接复制矢量要快。
可以使用间接引用对象,例如引用或(可能是智能的)指针。例如,您可以编写std::vector<std::string>& boo = foo;
,在这种情况下不会发生元素复制。
间接引用对象时,必须非常小心以确保所引用对象的生存期至少与使用引用一样长。如果对象的生存期在仍然存在引用的情况下结束,则认为该引用是悬空的。尝试通过悬挂引用访问对象的行为是不确定的。
答案 1 :(得分:1)
如果您想复制某些内容,可以使用std::shared_ptr
。简短示例:
#include <iostream>
#include <memory>
#include <string>
#include<vector>
typedef std::vector<std::string> string_vector;
int main() {
std::shared_ptr<string_vector> s_ptr = std::make_shared<string_vector>( string_vector({"a","b"}) );
auto s_ptr_2 = s_ptr;
(*s_ptr_2)[0] = "c";
std::cout<<(*s_ptr)[0]<<" "<<(*s_ptr)[1] <<std::endl;
std::cout<<(*s_ptr_2)[0]<<" "<<(*s_ptr_2)[1] <<std::endl;
}
我建议您在使用shared_ptr
(生命周期,对象所有权)之前先阅读一下
答案 2 :(得分:1)
根据我的理解,您希望vector
boo包含foo内部的内容而不实际复制任何数据吗?在这种情况下,您有两个选择。
在第一种情况下,您可以按照eerorika的建议进行操作,并使boo成为对foo的引用,本质上与指针相同。我认为这并不是您想要的。
std::vector<std::string> & boo = foo;
或者,您可以使用std::move
,它将设置boo的内部指针指向foo的元素,然后将foo的内部指针设置为nullptr
。这样会使foo处于不安全的状态,因此不能使用,因此在执行此操作后请勿对其进行任何调用。
std::vector<std::string> boo(std::move(foo));