【问题标题】:How do I get elements into a nested vector with an initializer list c++如何使用初始化列表 c++ 将元素放入嵌套向量中
【发布时间】:2021-06-02 00:32:12
【问题描述】:

我有一个 Matrix 类,它在向量中包含一个向量作为其中的数据。我希望能够通过初始化列表插入元素。

一个例子如下:

#include <vector>
int main(void) {
    std::vector<std::vector<int>> v = {
        { 1, 2, 3, 4, 5 },
        { 6, 7, 8, 9, 10 }
    };
}

还应注意,我在 Matrix 类中使用的向量是我编写的自定义向量类。我找到了一种使用初始化列表向向量添加元素的方法,但我不知道如何对嵌套初始化列表执行相同操作,因为初始化列表不提供下标。

我知道外部初始化列表的大小(在上面的示例中是两个),但我不知道如何获取第二个初始化列表的大小。

到目前为止,这是我的代码的 sn-p。

Matrix.h

template<class type>
class Matrix {
    private:
        Vector<Vector<type>> data;

    public:
        Matrix() {}
        Matrix(std::initializer_list<std::initializer_list<type>> init_list) {
            /* Get the data */
        }
        
}

此外,std::vector 类如何接收可能无限量的初始化列表并对其进行排序?

【问题讨论】:

  • 考虑一种不同的方法 - 让您的Vector 支持将std::initializer&lt;T&gt; 作为输入,然后让您的MatrixVector&lt;Vector&lt;T&gt;&gt; 作为输入并复制/移动它,不要'根本不需要std::initializer_list
  • 旁注:vector 的基于 vector 的矩阵往往很慢,因为 vector 保证连续(因此缓存友好)数据,vectorvectors可能会溅到整个存储空间(因此对缓存不友好)。您通常会看到列数较少的矩阵的效果。
  • 你那行写着std::vector&lt;std::vector&lt;int&gt;&gt; = { 的行实际上并没有创建一个变量,因为没有变量名。
  • 考虑展平向量。您将获得更好的性能,高于 2 或 3 的高阶维度会使代码更难理解,因为多维数组难以可视化。

标签: c++ initializer-list


【解决方案1】:

我希望能够通过初始化列表插入元素。 ...我知道外部初始化列表的大小(在上面的示例中是两个),但我不知道如何获取第二个初始化列表的大小。

也许我误解了你,但下面的代码 sn-p 应该让你开始。根据clang++,它打印外部和内部初始化列表的大小以及元素,并在C++11中编译和运行良好。

// ...
    Matrix(const std::initializer_list<const std::initializer_list<type>> & init_list) {
        cout << "vector of " << init_list.size() << " vectors" << endl;
        for (const auto & inner_list : init_list) {
           cout << inner_list.size() << " elements: " << endl;
           for (const auto & m : inner_list) {
              cout << m << ",";
           }
           cout << endl;
        }
    }

// ...

Matrix<int> M { { 1, 2 }, { -1, 2 } };

此外,std::vector 类如何接收可能无限数量的初始化器列表并对其进行排序?

我不确定我是否理解您的意思。如果我理解这个问题,那么我认为上面的 sn-p 可以回答它。如果我不这样做,请在 cmets 中详细说明,我可以尝试解决它。​​

【讨论】:

  • 上述工作非常好,但它让我想到了如何在没有foreach(各种)的情况下循环,而不是使用索引for循环。
  • 在我的脑海中,for ( auto i = 0; i &lt; inner_list.size(); ++i)inner_list[i] 应该可以工作,但我还没有检查过。
猜你喜欢
  • 2021-07-04
  • 2014-08-24
  • 2020-06-23
  • 2018-10-03
  • 2016-12-02
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
相关资源
最近更新 更多