【问题标题】:what is the best way to convert a vector<int32_t> to int[]将 vector<int32_t> 转换为 int[] 的最佳方法是什么
【发布时间】:2015-10-01 13:10:19
【问题描述】:

我有一个包含 int32_t 的向量,我正在使用 Windows 64 位。我需要将其转换为 int 数组。

由于在我的特定平台上 int32_t 和 int 本质上是相同的类型,我可以这样做:(假设数组有足够的空间来保存向量中的所有数据)

 int out[1000]; //assuming that in has less data than 1000 
 std::vector<int32_t> in=getdata();
 memcpy(out,&int[0],in.size());

但它适用于 uint32_t 和 int 本质上是同一类型的平台。

确保它独立于平台并且可以在任何平台上工作的最佳方法是什么,例如 int 不是 32 位?

【问题讨论】:

  • unsigned int 可以保存 int 不能保存的值,因此您可能无法获得相同的值。
  • 我有点担心本质上是同一类型,因为即使uint32_tunsigned intint 仍然是签名的,所以对于任何超越INT_MAX 赌输了。
  • 更新了问题以反映您的 cmets。
  • 只要您创建与向量相同类型的数组 - 此代码将是可移植的。见en.cppreference.com/w/cpp/container/vector/data(底层存储必须是数组)
  • 如果sizeof (int) == sizeof (int32_t) 成立,你就不能使用in.data() 吗?

标签: c++ vector


【解决方案1】:

如果您正在寻找一种可移植的方式来复制数据,那么我会使用 std::copy

std::copy(in.begin(), in.end(), std::begin(out));

如果你想反过来将一个数组复制到一个向量中,那么你可以使用带有两个迭代器的向量构造函数:

some_type array_name[some_size];
std::vector<some_type> vector_name(std::begin(array_name), std::end(array_name));

如果您想将数组添加到已经存在的向量中,那么您可以使用 std::vector::assign 将向量的内容替换为数组

some_type array_name[some_size];
vector_name.assign(std::begin(array_name), std::end(array_name));

如果你想保留向量的内容并将数组的内容附加到向量中,那么你可以使用带有std::back_inserter的复制

some_type array_name[some_size];
std::copy(std::begin(array_name), std::end(array_name), std::back_inserter(vector_name));

【讨论】:

  • 你也可以简单地使用std::copy(in.begin(), in.end(), out);,因为copy带有一个迭代器并且指针是有效的迭代器。
  • @JoshKelley 但是这样一来,out 的类型就可以互换了,即您可以切换到std::array out 而无需进一步更改。
  • @dhke:如何使用此代码从数组复制到向量?
  • @dhke:谢谢,如果您想在创建矢量后添加到矢量中。
  • @NathanOliver:目前我没有这个需求,只是想学习,所以我们来看看这两种情况。
【解决方案2】:
 std::vector<int32_t> in=getdata();     
 std::vector<int> out( in.begin(), in.end() ); 

然后您可以使用out.data() 作为数组访问out

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2016-05-17
    • 2015-05-15
    • 2016-05-29
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多