【问题标题】:How to push_back() C array into std::vector [duplicate]如何 push_back() C 数组到 std::vector [重复]
【发布时间】:2020-10-19 21:37:40
【问题描述】:

这不能编译:

vector<int[2]> v;
int p[2] = {1, 2};
v.push_back(p); //< compile error here

https://godbolt.org/z/Kabq8Y

还有什么选择? 我不想使用std::array

std::vector 本身的声明会编译。无法编译的是 push_back

【问题讨论】:

  • 数组是旧时代的愚蠢的人工制品。它们不能在没有帮助的情况下被复制、分配或移动,vector 做了很多所有这些操作。考虑使用 std::array 而不是普通的旧数组。 std::array 聪明多了。
  • 噢。如果没有std:: array,你可以使用std::pair,但这太笨拙了。您还可以围绕可以复制、分配和移动的数组创建自己的结构,但此时您刚刚重新制作了std::array。拥有两个 int 成员的简单结构可能更容易(基本上是 std::pair,但您可以为成员提供描述性名称)..
  • std::array 的反感是什么?似乎是解决问题最直接的方法。对于潜在的回答者来说,了解为什么明显的选择被拒绝可能会很有用。
  • 我不想使用std::array。为什么?这本身就是一个愚蠢的要求(如果你的作业没有提供它,不想并不表示)。
  • 这是一个有点傻的选择:根本不存储数组。只需存储两倍数量的ints 并在访问时将索引翻倍以获得“数组”的第一个元素的位置..

标签: c++ arrays stdvector push-back


【解决方案1】:

如果您真的不想使用std::array,则可以使用包含数组的结构或包含两个整数的结构:

struct coords {
    int x, y;
};

vector<coords> v;
coords c = {1, 2};
v.push_back(c);

或者,如前所述,您可以使用包含数组的结构:

struct coords {
    int x[2];
};

vector<coords> v;
coords c = {1, 2};
v.push_back(c);

【讨论】:

    【解决方案2】:

    使用std::array:

    vector<std::array<int, 2>> v;
    std::array<int, 2> p = {1, 2};
    v.push_back(p);
    

    【讨论】:

    • 这将是显而易见的替代方案,但 OP 明确声明不得使用 std::array
    • 不幸的是,它要么是std::array,要么是具有相同属性的任何其他类型。只是不是一个普通的旧“数组”。
    • 我将删除我的 DV,但请注意已删除的答案与您的答案相同,您只是看不到它们。
    • 对不起,我投了反对票,但我明确指出我不想使用std::array(从一开始就是这样,不是我后来编辑了这个问题)。否则这将是一个很好的答案。
    • @tuket 我明白了。只是很遗憾地说,没有办法“直接”使用数组。间接地是另一个故事。
    【解决方案3】:

    我认为您应该检查 C++ 参考中的向量。

    http://www.cplusplus.com/reference/vector/vector/vector/

    您可以在示例中看到,说明了初始化向量的所有方法。

    我认为对于您的情况,您需要这样做:

     std::vector<int> v({ 1, 2 });
     v.push_back(3);
    

    【讨论】:

    • 这将是低效的,因为向量将元素存储在堆上。使用std::array 要好得多,但 OP 出于某种原因想要避免它(我担心,这有点暗示他们也想要避免向量)。
    • 是的,当然,您指出的是正确的,但我正在回答如何对向量进行后推以及上述代码中的错误的问题。他没有要求使用性能最高的数据结构,也没有告诉我们代码的用法。我认为这只是为了学习。
    • @DanielLangr 不,我不想避免使用向量。所以我认为这个解决方案和使用std::vector&lt;std::array&lt;int, 2&gt;&gt; 一样高效
    • @tuket 你说得对,我忽略了自己,我的错。我认为有一个 vector-of-vectors 代替。
    【解决方案4】:

    作为替代方案,当您明确声明不使用 std::array 时,您可以使用指针,这是一种奇怪的解决方案,但它会起作用:

    #include <iostream>
    #include <vector>
    
    int main()
    {
        const int SIZE = 2;
        std::vector<int*> v;
        static int p[SIZE] = {1, 2}; //extended lifetime, static storage duration
        int *ptr[SIZE]; //array of pointers, one for each member of the array
    
        for(int i = 0; i < SIZE; i++){
            ptr[i] = &p[i];  //assign pointers
        }
     
        v.push_back(*ptr); //insert pointer to the beginning of ptr
    
        for(auto& n : v){
            for(int i = 0; i < SIZE; i++){ 
                std::cout << n[i] << " "; //output: 1 2
            }
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 2017-09-21
    • 1970-01-01
    • 2013-10-15
    • 2021-06-18
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多