【问题标题】:Convert multiple vectors to array, or return them (c++)将多个向量转换为数组,或返回它们(c++)
【发布时间】:2017-08-05 07:34:34
【问题描述】:

为了更熟悉 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 更改为返回参数的函数。我添加了 void,因为我想检查这些值是否打印正确。

【问题讨论】:

  • “出口”是什么意思?柜台跟出口有什么关系?循环的大小也与导出无关。请说明您要完成的工作。
  • 将它们放入std::vector 并从函数中返回?
  • 类似这样的东西:std::vector&lt;std::vector&lt;int&gt;&gt; outs; outs.push_back(aOut); outs.push_back(bOut); outs.push_back(cOut); return outs;
  • std::array&lt;std::vector&lt;int&gt;, 3&gt; outArray; 是一个包含三个向量的数组。 outArray[0] 将替换 aOut 等。
  • @bgaard 你有#include &lt;array&gt;#include &lt;vector&gt; 吗?

标签: c++ arrays vector integer constants


【解决方案1】:

创建一个将 3 个向量封装为返回元素的元素(容器)怎么样?

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

您可以使用一个 class 或一个 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;
}

【讨论】:

  • 谢谢,这是一个非常酷的方法!一个问题。使用结构和类之间有很大区别吗?如我所见,使用结构更容易,因为我可以跳过所有“公共/私有”和“构造函数/析构函数”-stuff :)
  • 好问题。 C++ 中的结构和类之间实际上并没有太大区别,除了容器内成员的默认可见性。 C++ 结构成员默认是公共的,而类成员默认是私有的。他们都有继承权。我个人喜欢将结构用于较小的数据,因为我不使用函数来操纵它们的状态。检查这个答案:stackoverflow.com/questions/54585/…
【解决方案2】:

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

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 ABC[N][3] 的 int 数组,其中 const int N = cOut.size();。这不起作用,因为 N 不被接受为常数。

数组的大小(无论是原始的还是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

请参阅Choice between vector::resize() and vector::reserve(),了解reserveresize 之间的区别。

【讨论】:

    猜你喜欢
    • 2020-01-11
    • 2012-01-08
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多