【问题标题】:Creating list of lists in c++ [duplicate]在c ++中创建列表列表[重复]
【发布时间】:2018-06-25 10:29:34
【问题描述】:

在 C++ 中,创建一定大小的列表的推荐方法是什么,其中列表的每个元素都是 3 个元素的列表?

类比

为了澄清,Python 中我正在尝试做的类比如下:

最简单的:

n = 10
ls = [[0,0,0] for i in range(n)]

也已经初始化了并且我可以访问元素(例如ls[0][0])甚至修改它们(ls[0][0]=2),完美!

或使用 numpy

import numpy as np
n  = 10 #number of elements
ls = np.empty((n,0)).tolist()

然后到每个元素(这里是一个列表),我们将附加我们的 3 个值。

基本尝试

现在我了解了 C++,一个开始的区别是具体定义内部列表应该包含的变量类型。但是vector 不是 C++ 中的变量类型,对吧?类似于以下内容:

int n = 4;
vector<vector> ls(4);
for(int i=0; i<n; i++) {
    ls[i] = {0,0,0};
}

会错的。此外,如果我尝试改为vector&lt;int&gt; ls;,那么我无法为每个元素分配列表。

问题:

  • 有没有办法在 C++ 中使用 vector 使 htis 工作?
  • 或者,有没有更简单的方法来解决这个问题?

【问题讨论】:

  • 您不应该标记 Python,因为您的问题与 Python 无关,即使您将其用作示例。
  • std::vector 是一个容器,但它肯定不是一个列表。
  • 我会使用 std::vector&lt;std::vector&lt;int&gt;&gt; 来做类似的事情。
  • 如果内部元素的大小是编译时常数,std::vector&lt;std::array&lt;int, 3&gt;&gt; 可能更可取。
  • @François Andrieux 好点。

标签: python c++ list vector


【解决方案1】:

我能想到的最接近Python代码的是:

std::vector<std::vector<int>> ls(10, std::vector<int>(3));

如果在编译时知道大小,您也可以使用std::array

std::array<std::array<int, 3>, 10> ls;

【讨论】:

  • @user929304,我的答案中发布的代码将对ls的元素进行零初始化。您不需要编写代码来将数组的元素初始化为 0。cout &lt;&lt; ls[0] 本身不受语言或标准库的支持。您必须在应用程序中编写一个函数才能做到这一点。
  • @user929304,这是正确的,但它更好。您可以使用 std::array 获得内置数组的所有优点和更多优点。
  • 因为我在编译时只知道内部列表的大小,所以我做了以下操作:vector&lt;array&lt;int,3&gt;&gt; ls;ls.resize(n); 在运行时定义外部向量的大小, (n 设置为 4)。但奇怪的是,当我尝试打印 ls[0][4] 时,它不会给出错误,而是打印 0,我的意思是 ls 的第二个索引应该只从 0 到 2,因为内部列表是大小为 3 的数组。这是怎么回事? :)
  • @user929304,它之所以有效,是因为std::vectorstd::array 都使用连续数据。理论上,这是未定义的行为。
【解决方案2】:

您可以创建一个二维向量,每个向量的大小为 3,如下所示:

std::vector<vector<int>> someVec;
someVec.resize( n , std::vector<int>(3));

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    在c++中,推荐的创建某个列表的方法是什么 大小,其中列表的每个元素都是 3 个元素的列表?

    [...]

    已经初始化

    如果 3 在编译时是固定的,那么你可以使用std::array&lt;T, 3&gt; 作为外部容器的元素类型。如果“特定大小”直到运行时才确定,那么外部容器将是动态的,例如 std::list

    让我们假设 Tint 就像在你的例子中一样:

    #include <list>
    #include <array>
    #include <iostream>
    
    int main()
    {
        int n;
        std::cin >> n;
        std::list<std::array<int, 3>> list(n, { 1, 2, 3 });
        for (auto const& array : list)
        {
            std::cout << array[0] << ", " << array[1] << ", " << array[2] << '\n';
        }
    }
    

    注意我如何使用second std::list constructor overload 来指定初始化每个元素的值 (std::array&lt;int, 3&gt; { 1, 2, 3 })。

    如果您实际上并不需要具有特定迭代器语义的 list,那么首选 std::vector 而不是 std::list

    【讨论】:

    • 对其他答案很好的补充,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多