问题描述
我的问题是我们的教授不允许我们使用向量。因此,在我不知道用户要输入多少次内容的情况下,我该如何使用 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 数组,则必须考虑两件事:
- 分配足以满足预期用例的最大存储空间。
- 你必须在一个额外的变量中跟踪当前使用的元素的数量,例如
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
必须牢记的一点:n
可能不会变得大于数组的大小。否则,读/写访问将导致未定义行为。
在应用 n
...
arr[n++] =
的大小不会有什么坏处
作为463035818_is_not_a_number
commented:
当然,另一种选择是使用 new[](和 delete[]
)管理动态内存,我认为这很痛苦。实际上,我的印象是 C++ 标准联盟为让应用程序开发人员摆脱这种痛苦做了很多努力。
尽管如此,许多教授似乎坚持学生必须学习这一事实。 (我不喜欢评判它的好坏。 - 由于过去缺乏替代品,我自己是这样学习的。)
然而,这个网站充满了尝试失败的问题......
我更喜欢提出一个简单的替代方案 - 根据做的事情永远不会比要求的更复杂(也称为 KISS principle)。