【问题标题】:Can I cast std::vector<int>* to int*? [duplicate]我可以将 std::vector<int>* 转换为 int* 吗? [复制]
【发布时间】:2015-11-11 01:04:51
【问题描述】:

假设我有一个 std::vector&lt;int&gt;* foo;,我必须将它用作旧 C 类型库 PVM 的 int*(int 数组,而不是指向 int 的指针)。就我而言,这可能会起作用,因为vector 将其元素彼此相邻地存储在内存中,就像数组一样。所以我尝试了(int*)foo,但不知何故我得到了一个我无法调试的错误,所以我认为这一定是问题所在。有什么想法、想法、优雅的解决方法吗?

【问题讨论】:

    标签: c++ arrays vector pvm


    【解决方案1】:

    您不能将向量直接转换为数组,因为向量对象包含指向数组数据的指针,而不是动态分配的数组数据本身。要访问底层数组,请使用data() 成员函数:

    std::vector<int> vec;
    
    int *arr = vec.data();
    

    或者

    std::vector<int> *vecp = new std::vector<int>;
    
    int *arr = vecp->data();
    

    【讨论】:

    • 这比我的回答好。
    • @Tas Yours 对于在 C++11 之前的版本中工作的人来说仍然非常有用。
    【解决方案2】:

    是的,你可以。您应该 @ApproachingDarknessFish 的 prefer this answer 使用 C++11 中引入的 std::vector::data

    但是,如果您使用的是旧版本的 C++,您可以使用 &amp;foo[0]int* 放在容器的开头。

    请参阅this question,了解为什么std::vector::data 优于&amp;foo.front()&amp;foo[0](如果foo 为空,两者都会产生未定义的行为!)

    看看这个this answer关于引用标准的std::vector内存的连续布局:

    23.2.6 类模板向量[vector]

    1 向量是支持随机访问迭代器的序列容器。此外,它还支持(摊销)恒定时间的最后插入和擦除操作;在中间插入和擦除需要线性时间。存储管理是自动处理的,但可以给出提示以提高效率。向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是除 bool 之外的某种类型,那么对于所有 0

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 1970-01-01
      • 2021-09-03
      • 2016-11-11
      • 1970-01-01
      • 2023-03-03
      • 2010-10-25
      • 1970-01-01
      • 2011-08-07
      相关资源
      最近更新 更多