【问题标题】:C++ arrays with unknown size未知大小的 C++ 数组
【发布时间】:2012-01-15 16:48:39
【问题描述】:

我正在尝试实现一个程序,它为您提供具有确定的开始、结束和基础的序列,问题是我无法确定元素的数量

这是我的简单算术级数生成器代码

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;
  }
}

它不会编译,因为它需要一个大小

我也希望代码尽可能简单,所以我希望我不必实现一个低效、耗时的链表

我也不知道如何处理向量,也许如果有一个快速指南我可以使用它

【问题讨论】:

  • 关于快速指南,(提示)google "c++ vector" -> 第一个结果是cplusplus.com/reference/stl/vector
  • ¤ 其他人已经提到了std::vector。如果你真的需要一个数组,那将是一个不错的选择。但是,数组很少是表示算术序列的好选择。例如,rand 函数是一个函数,而不是一个数组。而是定义一个具有计算序列中下一个数字所需的信息的对象,并让它提供一个成员函数next。您也可以或选择将其表示为 C++ 前向迭代器,但我认为如果需要,使用适配器会更好。所以,有状态的对象,而不是数组。干杯&hth.,
  • Alf,这对于专业编码人员来说是个好主意,但对于新手来说可能有点极端......
  • @StilesCrisis:它不适合专业编码人员,也不是“高级”。虽然我敢肯定,如果微软的用户界面人员被允许使用它,他们会将其标记为“高级”。他们甚至将编辑环境变量(在系统小程序中)的按钮标记为“高级”。我们达到了甚至放屁都是“高级”的地步,仅适用于专业美食家。我认为这很愚蠢。 :-) 干杯,
  • @StilesCrisis 我不能同意。如果它最终是好的,为什么新手学习不好的模式然后让他们重新学习?我的经验是,让一个人摆脱坏习惯比从一开始就教书更难。这就是为什么我喜欢“加速 C++”作为学习材料的原因:它避免了在 C++ 之前教 C 的常见模式,以及让坏习惯爬进来

标签: c++ arrays


【解决方案1】:

是的,使用 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;
}

名为result 的vector 一开始是空的,并且每次执行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++ 标准库参考,与 C++11 标准保持同步。

【讨论】:

  • 你需要一个“返回结果”;声明。
  • @Mr_C64 哎呀,谢谢,我猜这就是复制/粘贴代码所得到的结果
  • 是的,谢谢,看来我得学习一下向量(这不是坏事),非常感谢
【解决方案2】:

在这种情况下最好使用std::vector[tutorial]:

#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;
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      如果这太复杂了,请将result[] 设置为您可能想要的最大尺寸,并且将assert 设置为end - start 不会太大而无法容纳。当我还是一名新手程序员时,我就是这样做的,模板太令人生畏了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 2020-11-13
        • 2016-03-03
        • 2014-02-22
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多