以C++为单位将已知数量的整数输入正确读取到向量中



我是C++新手,今天想做一个小函数,它可以翻转提供给它的数组的所有元素(我有一个很好的主意(。我开始使用数组,但遇到了问题,因为只有指向第一个元素的指针传递给函数;它给出了一些非常奇怪的输出。建议我改用vector,但这也开始给我一些非常奇怪的输出。我添加了一个迭代向量值的cout,以查看它包含哪些内容以进行一些健全性检查,但输出完全奇怪;看起来我正在努力弄清楚如何正确读取输入。

正如我所提到的,我首先尝试了一个数组,我可以通过range-for循环很好地读取它。我在向量(解决方案 1(上尝试了同样的事情,发现它忽略了第一个输入,并为每个元素分配了我给它的最后一个值。

我首先尝试了其他 Stack 溢出线程,但我发现解决方案太冗长或不适合我需要的简单内容。

我想也许向量不能在range-for中使用,所以我做了for(auto x : array_size)- 这给出了一个错误,指出该函数没有合适的"开始",所以我把它改回来了。

相反,我环顾文档并找到了.push_back(value)(解决方案 2(,它似乎在向量的末尾放置了一个给定的值。以为我至少可以正确地获得一些输入,这将是朝着正确方向迈出的一步。相反,输出似乎显示它将向量中的位置数量增加了一倍,并且只是将我的第一个输入分配给最远的位置。我想这是因为我指定了向量的大小,然后push_back让向量增加该数量的输入(导致双倍大小的向量(。

至于输入值本身,我被难住了。

下面是与解决方案 2 相关的代码。

int main()
{
int array_size;
auto index_num = 0;
int arr_input = 0;
std::cout << "This program flips an array." << "n";
std::cout << "Enter how many elements will be in your array: ";
std::cin >> array_size;
std::vector<int> user_array (array_size);
std::cout << "Fill your array with integer values. Press 'Enter' after each: " << std::endl;
for(auto x : user_array)
{
std::cin >> arr_input;
user_array.push_back(arr_input);
}
index_num = sizeof(user_array) / sizeof(user_array[0]);  //or just use array_size-1 instead?
std::cout << "Your array, unflipped, contains the values: " << "n";
for(auto y : user_array)
{
std::cout << "[" << user_array[y] << "] ";
}

解决方案 2 提供以下输出:

Fill your array with integer values. Press 'Enter' after each:
1
2
3
4
5
Your array, unflipped, contains the values:
[0] [0] [0] [0] [0] [0] [0] [0] [0] [1]

解决方案 1,我尝试直接输入到向量的第 n 个位置(就像我对数组所做的那样(提供以下输出(具有相同的五个 1 - 5 输入(:

Your array, unflipped, contains the values:
[0] [5] [5] [5] [5]

没有错误消息,一切都是完全合法的,我显然只是不明白像向量这样简单的东西是如何在这里实现的。

我什至还没有达到繁重的位 - 翻转数组!任何建议表示赞赏。

>std::vector<int> user_array (array_size)创建一个包含array_size零的向量。然后,您可以使用push_back将其他元素添加到末尾。您需要使用std::vector<int> user_array创建一个空向量,并且可以通过调用user_array.reserve(array_size)来选择容量array_size的向量。由于您的向量现在开始时是空的,因此您需要将for(auto x : user_array)更改为非基于范围的循环,例如for (int i = 0; i < array_size; i++)

sizeof(user_array) / sizeof(user_array[0])仅适用于纯 C 数组,不适用于向量。使用array_sizeuser_array.size()

在最后一个基于范围的 for 循环中,y是数组中的值,而不是索引。所以打印y,而不是user_array[y]

您似乎将std::vector与 C 样式数组混淆了。


std::vector<int> user_array (array_size);

array_size零初始化user_array

for(auto x : user_array)
{
std::cin >> arr_input;
user_array.push_back(arr_input);
}

正如Alexander Zhang所注意到的,这块在迭代向量时修改了向量,这导致了未定义的行为。它可能会导致你的程序中出现任何快乐的事情,包括无限循环、完全崩溃、假设工作正常或恶魔从你的鼻子里飞出来

index_num = sizeof(user_array) / sizeof(user_array[0]);  //or just use array_size-1 instead?

这句话毫无意义。您可以使用其size()方法获取向量的长度:user_array.size();,但无论如何您都不使用该变量。

for(auto y : user_array)
{
std::cout << "[" << user_array[y] << "] ";
}

这个循环也没有意义。y不是向量中的索引,而是该向量中的值。如果你有一个向量{10, 20, 30},那么在第一次迭代中y等于10,在第二次迭代中y20,在第三次迭代中是y30


修复错误后,代码应如下所示:

std::vector<int> user_array ();
std::cout << "Fill your array with integer values. Press 'Enter' after each: " << std::endl;
for(int i = 0; i < array_size; ++i)
{
std::cin >> arr_input;
user_array.push_back(arr_input);
}
std::cout << "Your array, unflipped, contains the values: " << "n";
for(auto y : user_array)
{
std::cout << "[" << y << "] ";
}

或者,为了(不可见(提高性能,您可以在读取矢量之前保留矢量的大小:

std::vector<int> user_array ();
user_array.reserve(array_size);
std::cout << "Fill your array with integer values. Press 'Enter' after each: " << std::endl;
for(int i = 0; i < array_size; ++i)
{
int x;
std::cin >> x;
user_array.push_back(x);
}

最新更新