将多个向量转换为数组,或返回它们(c ++)

时间:2017-03-14 19:30:29

标签: c++ arrays vector integer constants

为了更熟悉C ++,我开始研究一些代数问题。现在,我已经创建了一个算法,该算法根据输入数字生成数字组合和一些约束:

void abc(const int n) {
    std::vector<int> aOut, bOut, cOut;  // creating vectors to store values (dynamic int arrays)
    for (int a = 9; a <= n - 2; a++) {
        for (int b = a + 1; b <= n - 1; b++) {
            for (int c = b + 1; c <= n; c++) {
                aOut.push_back(a);
                bOut.push_back(b);
                cOut.push_back(c);
                // std::cout << "a = " << a << "    b = " << b << "    c = " << c << std::endl;
        }
    }
}

现在,我需要继续使用这些向量,所以我需要以某种方式返回它们。我试图创建一个大小为int ABC[N][3]的int数组,其中const int N = cOut.size();。这不起作用,因为N不被接受为常量。

我还尝试在循环中创建一个计数器,我生成向量,然后我转移到一个字符串,然后我转移到一个常量整数 - 这也不起作用。

我尝试制作一个指向常量int的指针,并使用它来改变循环中的常量,这也不起作用。

我甚至找到了一种根据我的循环计算大小的方法:

const int n = 20;
const int n1 = n - 10;                    // Manipulating input
const int N = n1*(n1 + 1)*(n1 + 2) / 6;   // Size of vectors

然后将值传递给函数:

void abc(const int n, const int N) { // same code as before }

但没有任何作用。老实说,我没有想法(并失去理智)。我已经浏览了论坛和谷歌,但没有运气。如果有人能指出我正确的方向,我会永远感激。

原因解决方案包括将void更改为返回参数的函数。我添加了空白,因为我想检查值是否正确打印。

2 个答案:

答案 0 :(得分:3)

如何创建一个元素(容器),将3个向量封装为返回元素?

  

你遇到的问题是函数(如Mathemematicians想要的)返回一个值,但这可以是任何值:)。

您可以使用 struct ,它们将向量作为属性:

struct returnElement { // choose an adequate name
  std::vector<int> aOut, bOut, cOut;
};

所以现在你的abc函数会返回returnElement struct。它可能看起来像这样:

returnElement abc (const int n) {
    returnElement ret;  // creating vectors to store values (dynamic int arrays)
    for (int a = 9; a <= n - 2; a++) {
        for (int b = a + 1; b <= n - 1; b++) {
            for (int c = b + 1; c <= n; c++) {
                ret.aOut.push_back(a);
                ret.bOut.push_back(b);
                ret.cOut.push_back(c);
        }
    }
    return ret;
}

答案 1 :(得分:1)

为什么没有std::array std::vector

std::array<std::vector<int>, 3> abc(int const n)
{
    std::array<std::vector<int>, 3> outArray;

    for (int a = 9; a <= n - 2; a++) 
    {
        for (int b = a + 1; b <= n - 1; b++) 
        {
            for (int c = b + 1; c <= n; c++) 
            {
                outArray[0].push_back(a);
                outArray[1].push_back(b);
                outArray[2].push_back(c);
            }
        }
    }

    return outArray;
}

要回答有关数组大小的问题,

  

我试图创建一个大小为的int数组:int ABC [N] [3],其中const int N = cOut.size();.这不起作用,因为N不被接受为常量。

数组的大小(无论是raw还是std::array)必须是编译时常量。如果在编译时未知大小,则必须创建动态数组(使用new)或使用std::vector

如果您知道矢量有多大,可以为元素预留空间,如下所示:

std::vector<int> yourVec;
yourVec.reserve(100);     // reserve space for 100 ints

std::vector<int> yourVec;
yourVec.resize(100, 0);   // populates yourVec with 100 ints with value 0

有关reserveresize之间的差异,请参阅Choice between vector::resize() and vector::reserve()