C++数组的大小未知

4

我正在尝试实现一个程序,它可以给你一个确定的起始、结束和基础数字组成的序列。问题在于我无法确定元素的数量。

这是我用于生成简单算术级数的代码:

float Arithmetic_squence[](float start, float end, float b) {
  float result[];
  float last_number = start;
  while (last_number <= (end - b)) {
    result[sizeof(result)] = last_number;
    last_number += b;
  }
}

由于需要指定大小,所以它无法编译

我希望代码尽可能简单,因此不想实现低效、耗时的链表

我也不知道如何处理向量,如果有快速指南,我可能会使用它


2
关于一个快速指南,(提示)谷歌搜索“c++ vector”->第一个结果是http://www.cplusplus.com/reference/stl/vector/ - log0
¤ 其他人已经提到了 std::vector。如果你真的需要一个数组,那么这将是一个不错的选择。然而,数组很少是表示算术序列的好选择。例如,rand 函数是一个函数,而不是一个数组。相反地,定义一个包含计算序列中下一个数字所需信息的对象,并让它提供一个成员函数 next。你也可以选择或同时将其表达为 C++ 前向迭代器,但如果需要的话,我认为适配器更好。因此,使用有状态的对象,而不是数组。祝好运! - Cheers and hth. - Alf
1
Alf,对于一个专业的编码人员来说,这是一个好主意,但对于一个新手来说可能有些过分了... - StilesCrisis
1
@StilesCrisis:这不是专家程序员使用的,也不是“高级”的。虽然我相信如果微软的用户界面人员能够接触到它,他们会将其标记为“高级”。他们甚至将编辑环境变量的按钮(在系统小程序中)标记为“高级”。我们甚至到了连放屁都成为“高级”、只有专家美食家才能做到的地步。我认为这很愚蠢。 :-) 祝好! - Cheers and hth. - Alf
1
@StilesCrisis 我不能同意你的观点。如果最终结果是好的,为什么要让新手学习错误的模式,然后再让他们重新学习呢?我的经验是,让人改掉坏习惯比一开始就教对他们更难。这就是为什么我喜欢《C++加速学习》这样的学习材料:它避免了在教授C++之前先教授C语言,并且避免了不良习惯的产生。 - David Rodríguez - dribeas
显示剩余3条评论
4个回答

6

使用 std::vector,它是一个运行时可调整大小的数组的标准库实现:

vector<float> Arithmetic_squence(float start, float end, float b) {
  vector<float> result;

  float last_number = start;

  while (last_number <= (end - b)) {
    result.push_back(last_number);
    last_number += b;
  }

  return result;
}

vector 名为 result 的向量一开始是空的,每次执行 push_back 函数都会向其中添加元素。

你可以使用 size() 成员函数获取向量中元素的数量:

vector<float> f = Arithmetic_squence(x, y, z);

for (int i = 0; i < f.size(); ++i)
    cout << f[i] << endl;
vector成为一个非常强大的工具,当你学习标准库中的细节(迭代器、算法等)时;请参阅http://en.cppreference.com/w/cpp/container/vector以获取有关std::vector的参考资料,并参阅http://en.cppreference.com/w/cpp/以获取与C++11标准最新相符的通用C++标准库参考资料。

1
你需要一个“return result;”语句。 - user1149224
@Mr_C64 哎呀,谢谢提醒。这就是你复制/粘贴代码的后果。 - Seth Carnegie
是的,谢谢。看来我得学习一下向量(这并不是坏事),非常感谢。 - Ahmed Nematallah

3

在这种情况下,最好使用std::vector[教程]

#include <vector>

std::vector<float> Arithmetic_squence(float start, float end, float b) {
  std::vector<float> result;
  float last_number = start;

  while (last_number <= (end - b)) {
    result.push_back(last_number);
    last_number += b;
  }

  return result;
}

1

在C++中,您不能使用变长数组(VLA)。有些编译器支持可变长度数组作为编译器扩展,但如果您使用这些扩展,您的代码将不可移植,因为它不符合标准规范。
最好的选择是简单地使用std::vector


1

你需要使用 std::vector 来实现一个可变大小的数组。

如果这太复杂了,那就把 result[] 设为你可能需要的最大尺寸,并且 assert 确认 end - start 不会太大而无法容纳。这就是我当初作为一名新手程序员时所做的,因为模板对我来说太过困难了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接