为了更熟悉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
更改为返回参数的函数。我添加了空白,因为我想检查值是否正确打印。
答案 0 :(得分:3)
如何创建一个元素(容器),将3个向量封装为返回元素?
你遇到的问题是函数(如Mathemematicians想要的)返回一个值,但这可以是任何值:)。
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
有关reserve
和resize
之间的差异,请参阅Choice between vector::resize() and vector::reserve()。