C ++创建一个向量大小的数组,然后将向量复制到C样式数组中[重复]

Posted

技术标签:

【中文标题】C ++创建一个向量大小的数组,然后将向量复制到C样式数组中[重复]【英文标题】:C++ create an array of size of a vector and then copy vector into C style array [duplicate] 【发布时间】:2018-11-15 06:43:49 【问题描述】:

VC++ 给出以下代码错误:

#include <vector>
#include <iostream>

int main()

    std::vector<int> a;
    a.push_back(10);
    a.push_back(20);
    a.push_back(30);
    int arr[a.size()];
    std::copy(a.begin(), a.end(), arr);
    for(int index = 0 ; index < a.size(); index++)
    
        std::cout << " The value is " << arr[index] << std::endl;
    

在整数数组声明中出错,指出变量“a”的值不能用作常量?

我们如何解决我的目标是将矢量的内容传输到 'C' 样式数组的问题?

【问题讨论】:

如果你只需要一个int *指针来传递给一个函数,你可以使用a.data() @Programmer - 请参考更新后的答案。之前的回答中有一些错误的信息。 我问这个问题可能很天真,但老实说,为什么要这样做? auto copy_a = a; 会给你同样的东西,没有任何麻烦、头痛或担心需要手动 delete[] 任何东西。 【参考方案1】:

此错误与编译器有关。 C++ 要求数组定义中的常量。一些编译器提供了一个扩展来帮助在声明 Array 时使用非常数。我在 Xcode 10 (GCC) 上成功编译了您的代码。

对于您的编译器,您只需添加 int *arrPtr = a.data(); 即可获取给定数组的 c 样式数组指针。

int main()

    std::vector<int> a;
    a.push_back(10);
    a.push_back(20);
    a.push_back(30);
    //int arr[a.size()];
    //std::copy(a.begin(), a.end(), arr);
    //for(int index = 0 ; index < a.size(); index++)
    //
    //    std::cout << " The value is " << arr[index] << std::endl;
    //

    int *arrPtr = a.data();
    for(int index = 0 ; index < a.size(); index++)
        std::cout<< " The value is " << arrPtr[index] << std::endl;

    for(int index = 0 ; index < a.size(); index++)
    
        std::cout<< " The value is " << *arrPtr << std::endl;
        arrPtr++;
    

【讨论】:

“有些编译器在声明数组时需要常量” - 不,C++ 语言 需要数组定义中的常量。一些编译器只是提供了 C++ 之外的扩展。 @StoryTeller - 感谢您的解释。相应地更新了答案。【参考方案2】:

编译器告诉你的是,a.size() 不是 compile time 常量吗?因此,您不能像这样声明数组。您需要致电int *arr = new int[a.size()];,然后稍后将其删除。

【讨论】:

不,OP 肯定不需要手动管理数组生命周期。将一个向量复制到另一个向量是一个单行,并且可以通过构造来纠正。

以上是关于C ++创建一个向量大小的数组,然后将向量复制到C样式数组中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++中动态大小的二维数组中的用户输入

将数字从标准输入获取到 C 中的数组

将数据从C#传入和传出DLL

C ++将向量附加到另一个向量中[重复]

C ++:终止遍历字符串向量的循环的最优雅方法?

如何通过C ++中的数据获得向量的索引