在c++中,向量中的数字相乘顺序错误
multiplying numbers in vector out of order in C++
我叫Matt。我是StackOverflow的新手,也是c++的新手。目前正在学习Lippman的c++ Primer。
我正在做书上的一个练习,任务是将整数读入向量,然后通过做第一和最后,第二和倒数第二,第三和倒数第三等等来乘以这些整数。
我自己做的,没有查找任何东西,否则我几乎学不到如果我只是复制…我的程序按预期编译并运行。我的问题是:我这样做对吗?有没有更有效的方法?
我不仅想学习如何使工作代码,但我想做正确的。提前感谢!
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using std::cout; using std::cin; using std::vector; using std::endl;
using std::string;
int main()
{
vector<int> numbers;
int usernum = 0;
cout << "Enter some numbers: ";
while (cin >> usernum)
{
numbers.push_back(usernum);
}
unsigned maxElement = numbers.size() - 1;
unsigned minElement = 0;
for (auto i : numbers)
{
cout << numbers[minElement] << " * " << numbers[maxElement] << " = " << numbers[minElement] * numbers[maxElement] << "n";
++minElement;
--maxElement;
}
return 0;
}
在评论中,你说:
我注意到它实际上并没有完全像预期的那样工作。它遍历vector并将所有元素相乘两次maxElement一直到开始,minElement一直到结束。不知道如何停止它,一旦它只完成了一次操作。
如果您不想重复乘法,则需要更改for
环位。
for ( ; minElement <= maxElement; ++minElement, --maxElement)
{
cout << numbers[minElement] << " * " << numbers[maxElement] << " = " << numbers[minElement] * numbers[maxElement] << "n";
}
p
当您使用此逻辑时,您需要确保minElement
和maxElement
是有符号类型。否则,如果numbers
只有一个元素,您将遇到问题。
- 让我感到奇怪的第一件事是您使用的名称空间。而不是做:
using namespace std::vector;
,你可以做using namespace std;
,因为你调用std::vector:vector<int> numbers;
***。这适用于您使用的任何"已使用"的名称空间。只要一次性完成using namespace std;
即可。***我不确定std::vector/std::cout/…甚至是一个名称空间。STD——是一个命名空间。std::vector应该是std命名空间下的类:
namespace std
{
template<typename T> class vector<T> {...};
}
-
为什么它"按预期运行"?我不明白这个循环:
while(cin >> usernum)
。从那个点开始,您如何知道用户输入何时完成?对于第一眼(我没有自己编译/运行它),我希望它要么:- 不是编译
- 运行时崩溃或有未定义的行为
- 无限运行while-loop
-
用这个代替:
for (int i = 0, end_of_vector = numbers.size(); i < end_of_vector/2; i++) { cout << numbers[i] << " * " << numbers[end_of_vector - 1 - i] << " = " << numbers[i] * numbers[end_of_vector - 1 - i] << "n"; }
原因:- 在这种情况下,你不需要任何特殊的变量来存储第一个和最后一个向量索引。
- 你只迭代半个数组。
- 使用
for (auto i : numbers)
,期望使用i
作为numbers vector
的元素。但你不这样做,相反,你使用数字。因此,这个for循环是有歧义的
- 如何按数字顺序插入链表节点?
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 如何使用 OpenMP 使线程以相反的顺序写入其数字?
- 删除C++中向量中第一个最小的数字(并保持顺序)
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 如何以相反顺序C 打印整数的单个数字
- 我不知道如何创建一个以数字/字母顺序打印出我的整数或字符串的程序
- 如何将int分解为数字并以相同的顺序为向量分配数字
- 函数以相反的顺序输出输入问题,并改进算法以解释相等的数字
- 编写模式识别'函数以查找特定顺序出现的数字?C++
- 意外参数通过使用STL数字的顺序
- 使用for循环检查数字的顺序、递减顺序和递增顺序
- 按数字顺序对数字进行排序
- 使用 "For Loop" 按以下顺序显示数字
- 随机顺序的连续数字
- 按字典顺序从范围中获取下一个数字(不包含所有字符串的容器)
- 如何从对数字进行排序到按C++字母顺序排序
- placeNumbers应该返回数字的顺序,以便满足布尔值向量中编码的条件
- 编写一个函数,返回一个堆栈,该堆栈包含所有小于给定数字的元素,并且顺序相同