从函数返回多维向量以在main中使用,如何正确使用

Return multidimensional vector from function for use in main, how to use correctly?

本文关键字:何正确 main 返回 函数 向量      更新时间:2023-10-16

我发现使用向量是实现我需要做的事情的最佳方式,但是我现在需要一些澄清。

我需要在外部 CPP 的函数中生成一个多维数组,然后在 main 中使其可用。

主.cpp

// include vector, using namespace etc.
function(2, 4);
// how to access vector elements here - vectorname[2][4]->classvar;  ? 

矢量.cpp

void function(value1, value2){
// class def
int value1 = value1;
int value2 = value2;
 vector<int>(value1)<vector<Class>(value2) vectorname>; // incorrect syntax? or new * vector ?
return vectorname; // ?
}

vector的语法需要一点时间来适应。int的 2D 矢量如下所示:

vector<vector<int> > myVector;

如果要设置特定维度,请使用采用大小的构造函数:

vector<vector<int> > myVector(10, vector<int>(5));

这将产生一个10x5向量为零。你可以这样做

vector<vector<int> > myVector(10, vector<int>(5, -1));

为元素提供初始值(在本例中-1)。

根据经验,您希望向量通过引用传递并按值返回。

如果你想要你的类的多维向量,它应该是:

vector<vector<Class> > vectorname;
return vectorname;

函数的签名应为:

vector<vector<Class> > function(value1, value2)

以及以下内容:

int value1 = value1;
int value2 = value2;

毫无意义。

你可以声明一个多维向量,如下所示:

std::vector< std::vector<int> > v;

您还可以使用 typedef 使代码更易于遵循:

typedef std::vector<int> int_vector;
typedef std::vector<int_vector> int_matrix;

像第一个示例一样编写时,应避免一个接一个地编写右尖括号,以避免编译器将其与>>运算符混淆。

还应避免从函数返回此类对象,因为此操作涉及复制整个向量。相反,您可以通过引用传递向量,例如:

void process(int_matrix& m)
{
    // m.push_back(...)
}
int main(int argc, char* argv[])
{
    int_matrix m;
    // Initialize m here.
    // ...
    // Call your methods.
    process(m);
    // ...
    return 0;
}

编辑:

您可以像这样构建代码:

// int_matrix.hpp
#ifndef _INT_MATRIX_HPP
#define _INT_MATRIX_HPP
#include <vector>
typedef std::vector<int> int_vector;
typedef std::vector<int_vector> int_matrix;
extern void process(int_matrix& m);
#endif // ~_INT_MATRIX_HPP

.

// int_matrix.cpp
#include "int_matrix.hpp"
void process(int_matrix& m)
{
    m.clear();
    // ...
}

.

// main.cpp
#include "int_matrix.hpp"
#include <iostream>
int main(int argc, char* argv[])
{
    int_matrix m1;
    int_matrix m2;
    // ...
    process(m1);
    process(m2);
    // ...
    return 0;
}
你可以

这样做:

  1 #include <iostream>
  2 #include <vector>
  3 using namespace std;
  4 
  5 class Test {
  6 public:
  7     Test()
  8     {
  9         cout << "Test()" << endl;
 10     }
 11     ~Test()
 12     {
 13         cout << "~Test()" << endl;
 14     }
 15 };
 16 typedef Test classvar_t;
 17 typedef vector<classvar_t> d2_t;
 18 typedef vector<d2_t > md_vector_t;
 19 md_vector_t foo(int value1, int value2)
 20 {
 21     return md_vector_t(value1, d2_t(value2));
 22 }
 23 
 24 int main()
 25 {
 26     md_vector_t v = foo(3, 4);
 27     cout << "--------" << endl;
 28     return 0;
 29 }