在SO成员的帮助下,以下程序通过考虑以下标准成功地将静态1D阵列转换为2D矢量:
每次遇到值为0的元素时,都会创建一个新行。基本上,当遇到0时,行值增加,列值重置为0.如果遇到非零值,则保持行值并增加列值。
// declarations
int givenArray[9] = {1, 2, 3, 0, 4, 0, 1, 2, 1};
std::vector<int>::size_type j;
std::vector<int>::size_type i;
vector<vector<int>> my2dArray;
vector<int> dArray;
void calc(vector<int>&, int);
int task;
int sum = 0;
int main() {
for (int i = 0; i < 9;
i++) // iterate through all elements of the given array
{
if (i == 0) // adding the first element
{
my2dArray.resize(my2dArray.size() + 1);
my2dArray.back().push_back(givenArray[i]);
continue;
}
if (givenArray[i] == 0) // re-size if 0 is encountered
{
my2dArray.resize(my2dArray.size() + 1);
}
my2dArray.back().push_back(givenArray[i]);
}
for (std::vector<std::vector<int>>::size_type i = 0; i < my2dArray.size();
i++) {
for (std::vector<int>::size_type j = 0; j < my2dArray[i].size(); j++) {
std::cout << my2dArray[i][j] << ' ';
if (my2dArray[i].size() > 2) {
task = my2dArray[i].size();
calc(my2dArray[i], task);
}
}
std::cout << std::endl;
}
}
void calc(vector<int>& dArray, int task) {
int max = 0;
for (unsigned int j = 0; j < task; j++) {
if (dArray[i] > max)
dArray[i] = max;
}
cout << "\nMax is" << max;
}
但是,如果每行的列数超过2,我想将单行2D向量2dArray传递给函数calc。函数calc旨在找到所有元素的最大值。通过了行。上述程序无法产生所需的输出。
答案 0 :(得分:0)
你有一些问题:
您不需要在主要功能中循环j
- 您的calc
功能已经执行此操作。
您的calc
函数循环遍历j
,但在访问数组时使用全局变量i
。
您的calc
函数会将当前max
值分配给数组,而不是将数组值分配给max
答案 1 :(得分:0)
函数calc旨在查找传递行中所有元素的最大值。上述程序无法产生所需的输出。
您可以使用std::max_element
。
#include <algorithm>
//...
int maxVal = *std::max_element(my2dArray[i].begin(), my2dArray[i].begin() + task);
cout << "\Max is " << maxVal;
答案 2 :(得分:0)
一些改进:
i and j
个全局变量,您在循环初始化中声明循环的变量(例如:for( int i = 0 ; i&lt; 9; i ++) ,对于其他循环也一样。)typedef
可以更轻松地访问该类型的内部typedef
(例如:size_type
)。calc
方法,并且多次遍历同一行,这个调用应该每行执行一次。givenArray
的大小作为常量,稍后您可以向数组中添加一些元素并忘记更新该常量,最好声明一个变量并进行一般计算(使用sizeof )。calc
。std::max_element
标头algorithm
。如果你可以使用C ++ 11,givenArray
可以转换为std::vector<int>
并保持简单的初始化。
代码(在GCC 4.9.0中测试)
#include <vector>
#include <iostream>
using namespace std;
typedef std::vector<int> list_t;
typedef std::vector<list_t> list2d_t;
void calc(list_t& dArray, long& actual_max) {
for (unsigned int j = 0; j < dArray.size(); j++) {
if (dArray[j] > actual_max) {
actual_max = dArray[j];
}
}
cout << "Max is " << actual_max << "\n";
}
void calc(list_t& dArray) {
long actual_max = 0;
for (unsigned int j = 0; j < dArray.size(); j++) {
if (dArray[j] > actual_max) {
actual_max = dArray[j];
}
}
cout << "Max is " << actual_max << "\n";
}
int main() {
int givenArray[9] = {1, 2, 3, 0, 4, 0, 1, 2, 1};
int givenArraySize = sizeof(givenArray) / sizeof(givenArray[0]);
list2d_t my2dArray(1);
list_t dArray;
for (int i = 0; i < givenArraySize; i++) {
if (givenArray[i] == 0) {
my2dArray.push_back(list_t());
} else {
my2dArray.back().push_back(givenArray[i]);
}
}
long max = 0;
for (list2d_t::size_type i = 0; i < my2dArray.size(); i++) {
for (list_t::size_type j = 0; j < my2dArray[i].size(); j++) {
std::cout << my2dArray[i][j] << ' ';
}
std::cout << "\n";
if (my2dArray[i].size() > 2) {
// if you need the max of all the elements in rows with size > 2 uncoment bellow and comment other call
// calc(my2dArray[i], max);
calc(my2dArray[i]);
}
}
}
获得输出:
1 2 3
Max is 3
4
1 2 1
Max is 2