C++ 在列中显示DEQUE向量

C++ 在列中显示DEQUE向量,c++,c++11,vector,deque,C++,C++11,Vector,Deque,我试图像这样显示一个deques向量(std::vector v) v.at(0).at(0) v.at(1).at(0) v.at(2).at(0) v.at(3).at(0) v.at(0).at(1) v.at(1).at(1) v.at(2).at(1) v.at(3).at(1) v.at(0).at(2) v.at(1).at(2) v.at(2).at(2) v.at(3).at(2) v.at(1).at(3) v.at(3

我试图像这样显示一个deques向量(
std::vector v

v.at(0).at(0) v.at(1).at(0) v.at(2).at(0) v.at(3).at(0)
v.at(0).at(1) v.at(1).at(1) v.at(2).at(1) v.at(3).at(1)
v.at(0).at(2) v.at(1).at(2) v.at(2).at(2) v.at(3).at(2)
              v.at(1).at(3)               v.at(3).at(3)
                                          v.at(3).at(4)
向量的第一部分固定为7,但实际列的大小是动态的,这取决于用户选择执行的操作

我在尝试类似的东西

int row = 0;
int column;

for (column = 0; column < v.at(row).size(); column++){
      cout << "v["<< row <<"]["<< column << "]" << v.at(row).at(column) << "\t";
  while (row < v.size()){
    cout << endl;      
    row++;
  }
}

有那种无聊的头脑的日子。有人能帮我按我想要的方式打印出来吗?

首先,我建议获得最大队列大小

std::size_t  maxQ { 0U };

for ( auto const & q : v )
    maxQ = std::max(maxQ, q.size());
现在,您可以在
(0U,maxQ(
(行循环))上编写循环,在可用时写入元素,在其他情况下写入空格

for ( auto i = 0U ; i < maxQ ; ++i )
 {
   for ( auto j = 0U ; j < v.size() ; ++j )
      if ( i < v[j].size() )
         ; // print v[j][i]
      else
         ; // print space

   std::cout << std::endl; // endl of line
 }
用于(自动i=0U;istd::cout这是一个演示程序,展示了完成任务的方法之一

#include <iostream>
#include <iomanip>
#include <vector>
#include <deque>
#include <algorithm>

int main() 
{
    std::vector<std::deque<int>> v =
    {
        { 0, 1, 2 },
        { 0, 1, 2, 3 },
        { 0, 1, 2 },
        { 0, 1, 2, 3, 4 }
    };

    size_t n = std::max_element( v.begin(), v.end(),
                                 []( const auto &x, const auto &y )
                                 {
                                    return x.size() < y.size();
                                 } )->size();

    for ( size_t i = 0; i < n; i++)
    {
        for ( size_t j = 0; j < v.size(); j++ )
        {
            std::cout << std::setw( 4 );
            if ( i < v[j].size() )
            {
                std::cout << v[j][i];
            }
            else
            {
                std::cout << "";
            }
        }

        std::cout << std::endl;
    }

    return 0;
}

将参数传递给
at
时抛出错误,该参数不是有效的索引。如果查看
for
循环,在第二次迭代时,
必须等于或大于
v.size()
。该条件尝试调用
v.at(行)
然后必须失败。我不清楚代码背后的原因。你在
while
循环中执行
++row
,因此你(我称之为)有一个表示向量中维数的自变量。然后你在这里使用这个未经检查的变量:
v.at(row).
。您应该努力避免不这样做,并始终使用
size()
确定元素的数量。我的代码不起作用,我的推理有缺陷,今天早上我很难。我试图找出如何在上面显示的输出中获得向量中的数据,你对如何做到这一点有什么想法吗?我给你的主要建议是直接向前编写两个循环,然后进行eit她在该单元格中输出条目,如果相应列中没有那么多条目,则为空。您需要在任何列中获取最大项数,或者迭代,直到没有任何列输出条目。该循环应如下所示:
for(column=0;row
--您的
变量由于内部
while
循环而出错。我怀疑您实际上没有尝试过您的解决方案。您需要按列打印。此解决方案的复杂性将取决于您忽略的部分。@FrançoisAndrieux-嗯……我忘记了行的结尾(谢谢);补充。在我看来,OP很难管理索引(行和列)。这个答案(我希望)应该解释一下怎么做。它几乎完美了,所有的东西都被拉到左边了,我应该用iomanip或其他库做些什么吗?@BrendanJackson-对不起,我不明白你想用
iomanip
或其他库做什么我的编译器不喜欢你正在使用的闭包/lambda,“在lambda参数[](const auto&x,const auto&y)中不允许出现错误:'auto'”“您使用的不是c++11吗?我不使用的是什么?”BrendanJackson当您需要显式编写const std::deque&x,const std::deque&y时,就是这样,您是我的英雄!
#include <iostream>
#include <iomanip>
#include <vector>
#include <deque>
#include <algorithm>

int main() 
{
    std::vector<std::deque<int>> v =
    {
        { 0, 1, 2 },
        { 0, 1, 2, 3 },
        { 0, 1, 2 },
        { 0, 1, 2, 3, 4 }
    };

    size_t n = std::max_element( v.begin(), v.end(),
                                 []( const auto &x, const auto &y )
                                 {
                                    return x.size() < y.size();
                                 } )->size();

    for ( size_t i = 0; i < n; i++)
    {
        for ( size_t j = 0; j < v.size(); j++ )
        {
            std::cout << std::setw( 4 );
            if ( i < v[j].size() )
            {
                std::cout << v[j][i];
            }
            else
            {
                std::cout << "";
            }
        }

        std::cout << std::endl;
    }

    return 0;
}
   0   0   0   0
   1   1   1   1
   2   2   2   2
       3       3
               4