C ++中动态大小的二维数组中的用户输入

Posted

技术标签:

【中文标题】C ++中动态大小的二维数组中的用户输入【英文标题】:User Input in 2-D array of dynamic size in C++ 【发布时间】:2020-12-16 15:17:41 【问题描述】:

我正在尝试创建一个二维向量,该向量作为第 0 列将包含整数,而第 1 列将包含向量。

例如:

column[0]  column[1]
2          2
5          1,2,0
12         4,7,9,0,0,1,6,0,0
3          6

第 0 列将是用户输入,而第 1 列我将自己计算它 - 我不介意它现在是否有虚拟向量,在用户退出后它会打印二维向量。 我尝试的是:

int main() 
    unsigned int input;
    vector<vector<unsigned int>> v;
    while (cin >> input) // enter non int to exit
        for(int i=0; i<input;i++)
            vector<int> factorial; //calc in a separate function - dummy vector for now
            for (int j=0; j<factorial.size(); j++)
                v[i].push_back(input); //set column 0 as input
                v[i][j].push_back(factorial); //set column 1 as the vector containing the factorial of input
            
        
 return 0;

【问题讨论】:

你可能想要的是std::vector&lt;std::pair&lt;int,std::vector&lt;int&gt;&gt;&gt; 可能更容易定义自己的类型(struct),有两个字段,一个int和一个vector,然后设置一个这类类型元素的向量 或者,也许你想要的是一个键值字典。我的意思是这个问题不是很清楚。那两列有什么意义? 2之间有什么关系?如果您想要键值类型的构造,那么 std::map 就是您想要的 你能解释一下你想要达到的目标吗?也就是说,一旦你有了这个数据结构,你打算做什么? 我正在尝试存储它,以便在用户想要计算数字 x 的阶乘并且 y 的阶乘存在(并且 y 【参考方案1】:

看来你需要使用class:

#include <iostream>
#include <vector>

using namespace std;

template<class T1, class T2>
class Columns
public:
    vector<T1> input;
    vector<T2> output;
;

int main()
    Columns<int, int> columns; //Or, if you need to have vector in "output": \
                                 Columns<int, vector<int>> columns;
    //Usage:
    columns.input.push_back(2);
    columns.output.push_back(2);
    return 0;



但是,如果您需要更短的实现,可以使用map

#include <iostream>
#include <vector>
#include <map>

using namespace std;

int main()
    map<int, vector<int>> result;
    for(int i = 0; i < 10; i++)
        result[i] = factorial(i); //Where factorial() is function that returns vector
    for(auto res: result)
        cout << "Input: " << res.first << "; Result: ";
        for(auto res2: res.second)
            cout << res2 << "; ";
        cout << ";" << endl;
    

所以在“map”的情况下,输出应该是这样的:

输入:0;结果:这里有数字; ... 输入:9;结果:这里有数字


否则,您可以只使用 2 个不同的数组或vectors

也许,这是你现在最好的选择。

#include <iostream>
#include <vector>

using namespace std;

template<class T>
vector<T> FactorialNumbers(T input)
    vector<T> result;
    for((input < 0) ? return result : input = input; input != 0; input--)
        result.push_back(input);
    return result;


int main() 
    vector<int> input;
    vector<vector<int>> output;

    int usrInput = 0;
    while(cin >> usrInput)
        input.push_back(usrInput);
        output.push_back(FactorialNumbers(usrInput));
    

如果您只使用int,您可以像这样更改FactorialNumbers

int FactorialNumbers(int input)
    vector<int> result;
    for((input < 0) ? return result : input = input; input != 0; input--)
        result.push_back(input);
    return result;


你也可以试试:vector&lt;pair&lt;int, std::vector&lt;int&gt;&gt;&gt;

【讨论】:

考虑在您的答案中将map 替换为unordered_map

以上是关于C ++中动态大小的二维数组中的用户输入的主要内容,如果未能解决你的问题,请参考以下文章

基于用户输入的二维动态阵列

动态分配输入,并在C ++中输出2-D数组

如果用户输入“*”则添加 1,如果用户输入“”则添加 0 到 C 中的数组

在C#中怎么使数组是个可变的,数组大小由用户自己输入

C语言中,对于不知道长度的数组怎样输入。。。

使用动态二维数组时的 C++ 分段错误(核心转储)