如何浅复制指针到矢量?

时间:2019-07-11 14:17:17

标签: c++

是否可以将指针浅复制到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);更快吗?

3 个答案:

答案 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));