在C ++中无序地向量乘以向量中的数字

时间:2016-09-12 19:31:39

标签: c++ loops c++11 vector c++14

我的名字是马特。我是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;
}

2 个答案:

答案 0 :(得分:1)

在评论中,你说:

  

我注意到它并没有像预期的那样实际工作。当maxElement一直到开始时,它通过向量并将所有内容相乘两次,并且minElement将结束。一旦它只进行了一次操作,就不知道如何阻止它。

如果您不想重复乘法,则需要稍微更改for循环。

for ( ; minElement <= maxElement; ++minElement, --maxElement)
{
    cout << numbers[minElement] << " * " << numbers[maxElement] << " = " << numbers[minElement] * numbers[maxElement] << "\n";
}

<强> PS

使用此逻辑时,您需要确保minElementmaxElement具有签名类型。否则,如果numbers只有一个元素,则会遇到问题。

答案 1 :(得分:0)

  1. 我觉得奇怪的第一件事就是你正在使用的命名空间。 而不是:using namespace std::vector;你可以公平地做using namespace std;,因为你无论如何都要调用std :: vector:vector<int> numbers; ***。这适用于您使用的任何“已使用”命名空间。一劳永逸地做using namespace std;。 ***我不确定std :: vector / std :: cout / ...甚至是命名空间。 std - 是一个命名空间。 std :: vector应该是std命名空间下的一个类:
  2. namespace std { template<typename T> class vector<T> {...}; }

    1. 为什么它“按预期行事”。我不知道这个循环:while(cin >> usernum)。你怎么知道用户输入何时完成?第一眼看到(我自己没有编译/运行)我期待它:

      • 不编译
      • 在运行时崩溃或具有未定义的行为
      • 无限地运行while循环
    2. 请改用: 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循环是不明确的