在c++中,向量中的数字相乘顺序错误

multiplying numbers in vector out of order in C++

本文关键字:顺序 数字 错误 c++ 向量      更新时间:2023-10-16

我叫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

当您使用此逻辑时,您需要确保minElementmaxElement是有符号类型。否则,如果numbers只有一个元素,您将遇到问题。

  1. 让我感到奇怪的第一件事是您使用的名称空间。而不是做: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循环是有歧义的