是否有类似于向量 push_back 函数的东西可以用普通数组来做?

问题描述

我的问题是我们的教授不允许我们使用向量。因此,在我不知道用户要输入多少次内容的情况下,我该如何使用 C++ 中的普通数组来实现它

我正在尝试使用普通数组来做到这一点

vector<int> x; 
x.push_back(users_input); 

user_input 可以是用户输入的整数 那么我也应该能够找到它的大小

    int size = end(x) - begin(x); 

我的要求是,仅当程序属于该切换选项时,我才想向该数组添加值,这意味着我不确定用户决定进入该切换选项的次数

我可以创建一个数组并在很大程度上对其进行初始化。

int arr[1000]; 

但是我如何找到其中的元素数量,因为如果我使用 sizeof 它会给我“1000”而不是已存储的元素数量

有什么帮助吗?谢谢!

解决方法

我的问题是我们的教授不允许我们使用向量。

您可以向您的教授发送以下链接:Kate Gregory: Stop Teaching C。 (也许,在你通过课程之后再做。)

也就是说,如果您被迫使用 C 数组,则必须考虑两件事:

  1. 分配足以满足预期用例的最大存储空间。
  2. 你必须在一个额外的变量中跟踪当前使用的元素的数量,例如size_t n

示例:

#include <iostream>
#include <algorithm>

void print(int arr[],size_t n)
{
  for (size_t i = 0; i < n; ++i) std::cout << ' ' << arr[i];
  std::cout << '\n';
}

int main()
{
  // 10 is my optimistic assumption to be sufficient large.
  int arr[10] = { 1,3,5,4,2 };
  // remember that 5 elements are in use initially
  size_t n = 5;
  // show array
  print(arr,n);
  // use address of elements where iterators are required e.g. in std::sort
  std::sort(&arr[0],&arr[n]);
  // show sorted array
  print(arr,n);
  
  // how to apply something like std::vector::push_back()
  arr[n++] = -1;
  arr[n++] = 10;
  arr[n++] = 7;
  // show array again
  print(arr,n);
  // use address of elements where iterators are required (alternative form)
  std::sort(arr,arr + n);
  // show sorted array again
  print(arr,n);
}

输出:

 1 3 5 4 2
 1 2 3 4 5
 1 2 3 4 5 -1 10 7
 -1 1 2 3 4 5 7 10

Live Demo on coliru

必须牢记的一点:n 可能不会变得大于数组的大小。否则,读/写访问将导致未定义行为。 在应用 n...

之前检查 arr[n++] = 的大小不会有什么坏处

作为463035818_is_not_a_number commented

当然,另一种选择是使用 new[](和 delete[])管理动态内存,我认为这很痛苦。实际上,我的印象是 C++ 标准联盟为让应用程序开发人员摆脱这种痛苦做了很多努力。
尽管如此,许多教授似乎坚持学生必须学习这一事实。 (我不喜欢评判它的好坏。 - 由于过去缺乏替代品,我自己是这样学习的。)
然而,这个网站充满了尝试失败的问题......

我更喜欢提出一个简单的替代方案 - 根据做的事情永远不会比要求的更复杂(也称为 KISS principle)。