【问题标题】:vector of vectors push_back向量的向量 push_back
【发布时间】:2013-03-28 03:35:22
【问题描述】:

我正在用 C++ 设计一个多级队列过程模拟器,但是在尝试实现多个队列时遇到了问题(我的队列是向量)。所以, “多级”是一个 4 元素数组(不是向量)。每个元素内部都有一个向量(类型 t_PCB)。

vector<vector<t_PCB>> multilevel[4];

我的问题是:如何在这 4 个 t_PCB 向量的末尾插入一个元素?提前谢谢你。

我尝试了下面的代码行,但它不起作用(错误:不匹配调用'push_back'的成员函数)

multilevel[0].push_back(p); //where "p" is a t_PCB object

在谈论“多级”时不能使用上面的行,因为这个数组只接受参数类型:vector

所以,正如我一开始所问的:如何将对象类型“t_PCB”推入“多级”?

【问题讨论】:

  • multilevel 不是“4 元素向量”,而是包含 t_PCB 向量的向量数组

标签: c++ vector process push-back multi-level


【解决方案1】:

声明一个二维向量类似于声明一个数组。你也可以用同样的方法...

vector<vector<int> > vec;

for(int i = 0; i < 5; i++)
{
    vector<int> row;
    vec.push_back(row);
}

vec[0].push_back(5);
cout << vec[0][0] << endl;

【讨论】:

    【解决方案2】:
    vector<vector<int>> vec; // declare 2D vector
    
        for (int i=0; i<=3; i++) {
            vector<int> row;  // create a row vector which adds a row to vec
            for (int j=0; j<=4; j++) {
                row.push_back(j*10); // push elements 0,10,20,30,40 to row 
            }
            vec.push_back(row); // add this row to vec
            // Repeat this procedure 4 times to make a 4*5 2D vector
        }
    
        cout<<"output is "<<vec[2][4]; // output is 40
    

    【讨论】:

      【解决方案3】:

      只是把它放在那里,访问向量的向量:

      multilevel[outer][inner]
      

      outer 将返回该索引处的向量并进一步索引 inner 将返回 t_PCB 对象。您还可以使用 .at() 函数替换数组样式的索引以进行边界检查。

      【讨论】:

        【解决方案4】:

        你可以创建一个向量而不是数组:

        std::vector< std::vector<t_PCB>> multilevel(4); // 2 dim array, 1st dim is 4
        

        然后你可以在WHICH索引的向量的末尾push_back这样:

        multilevel[WHICH].push_back(p)
        

        【讨论】:

          【解决方案5】:

          通过这样做:

          vector<vector<t_PCB> > multilevel[4];
          

          您声明了一个由四个零大小vectors 组成的数组,每个数组都可以包含vector&lt;t_PCB&gt; 类型的对象。您可能想要做的是:

          vector<vector<t_PCB> > multilevel(4);
          //                               ^^^
          

          这将实例化四个vector&lt;t_PCB&gt; 类型的默认初始化对象的向量。然后,您可以这样做:

          multilevel[size].push_back(p);
          

          但请注意,向量索引(如数组索引)是从零开始的,因此size 必须小于向量的大小。

          在上面的表达式中,子表达式 multilevel[size] 返回对 size-th 向量的引用 multilevel,然后在该向量上调用成员函数 push_back(p),它附加元素 @ 987654332@给它。

          【讨论】:

          • 这段代码 --> multilevel[size].push_back(p);仅当多级声明如下时才有效;矢量 多级[4];
          • @jafm92 仔细看。您需要将[4] 更改为(4)。您正在声明一组向量的向量。 Andy 正在向您展示如何仅声明向量的向量。另一方面,vector &lt;t_PCB&gt; multilevel[4] 是一个向量数组。你需要决定你想要哪一个。
          • @jafm92 从您描述它的方式看来,您需要一个由四个向量组成的向量。在这种情况下,完全按照安迪所说的去做。
          • @sftrabbit 谢谢,我正在尝试实现一个由 4 个向量组成的向量。我认为(4)只是一个打字错误。 [4] 和 (4) 有什么区别?谢谢你(再次)
          • @jafm92:好的,作为类成员变量,您不能使用该语法。要么按照 sftrabbit 的建议 (vector&lt;t_PCB&gt; multilevel[4]),要么将其声明为 vector&lt; vector &lt;t_PCB&gt; &gt; multilevel; 并使用构造函数初始化列表将值 4 传递给 multilevel 的构造函数。
          【解决方案6】:

          您正在创建一个 vector&lt;vector&lt;t_PCB&gt;&gt; 数组,而不是单个对象。

          我认为做你想做的事情的正确方法是:

          vector<vector<t_PCB>> multilevel(4);
          multilevel[0].push_back(p)
          

          【讨论】:

            猜你喜欢
            • 2021-10-29
            • 2021-06-23
            • 2020-11-20
            • 2017-03-24
            • 1970-01-01
            • 1970-01-01
            • 2021-10-12
            • 2016-11-16
            • 1970-01-01
            相关资源
            最近更新 更多