【问题标题】:multiplying numbers in vector out of order in C++在C ++中将向量中的数字无序相乘
【发布时间】:2016-09-12 19:31:39
【问题描述】:

我叫马特。我是 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;
}

【问题讨论】:

  • 如果您有有效的代码,并且正在寻求有关如何改进它的建议,Code Review 可能是发布您问题的更好网站。
  • 你的 for 循环遍历了整个向量,以为它只需要遍历向量的一半。
  • @SomeGuy 你能告诉我是怎么做到的吗?另外,我注意到(这可能是您的意思,它将所有内容乘以两次,将操作数放在不同的边上。一旦它们被乘以一次,我将如何做一个停止循环的条件?
  • 如果您的程序正常运行,这将是codereview.stackexchange.com 的好帖子。
  • @RSahu 是的,我注意到它实际上并没有完全按预期工作。它通过向量并将所有内容相乘两次,因为 maxElement 一直到开始,而 minElement 一直到结束。每次只完成一次操作后,不知道如何停止它

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


【解决方案1】:

在评论中,你说:

我注意到它实际上并没有完全按预期工作。它通过向量并将所有内容相乘两次,因为 maxElement 一直到开始,minElement 一直到结束。每次只完成一次操作后,不知道如何停止它。

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

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

附言

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

【讨论】:

  • 谢谢!我工作得很好.. 很感激。
  • 那么奇数个元素的向量的中间元素是平方的吗?
  • 对不起,我不明白。我知道签名是为了能够有负值,但它在这里是如何工作的?另外,如果你不介意,你能告诉我 maxElement 为什么我必须有 -1 的尺寸。我做到了,但不知道为什么向量需要-1。
  • @nonsensickle,我的回答是,是的。不确定这是否是 OP 的意图。
  • @Matt,如果numbers 只有一个元素,maxElements 开始时为零,但在下一步中,通过执行--maxElements,它将变形为一个大数字而不是被设置到-1
【解决方案2】:
  1. 让我感到奇怪的第一件事是您使用的命名空间。 而不是这样做:using namespace std::vector; 你可以公平地做using namespace std;,因为无论如何你都调用 std::vector:vector&lt;int&gt; numbers;***。这适用于您使用的任何“使用过的”命名空间。只需一劳永逸地做using namespace std;。 ***我不确定 std::vector/std::cout/... 甚至是一个命名空间。 std - 是一个命名空间。 std::vector 应该是 std 命名空间下的一个类:

namespace std { template<typename T> class vector<T> {...}; }

  1. 它怎么会“按预期运行”。我不知道这个循环:while(cin &gt;&gt; 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 循环是模棱两可的

【讨论】:

  • 感谢您的回复。我使用单独的命名空间,因为这是 C++ Primer 一书所指示的,而不仅仅是使用 std 下的所有内容。我正试图绕开你的代码。非常感谢您的宝贵时间。
  • 另外,我知道我的代码在打破循环的条件方面并不完美。它只是一个控制台程序,所以我使用 ctrl+z。我只是在尝试完成本书要求的主要任务。我知道这并没有降低重要性,但主要任务对我来说已经够难了哈哈
  • 我建议检查这些命名空间是否存在。就个人而言,这是我第一次看到这样的命名空间。当然,有理由使用特殊的命名空间而不是普通的 std,以减少对您的源可见的事物的数量。但对我来说,看到这样的做法很奇怪。
  • 我想原因只是为了命名你使用的东西以减少发生冲突的机会或其他东西,所以只需声明你使用的东西而不是所有东西。并不是说你错了,这只是我对我正在阅读的《C++ Primer》一书的解释,因为它是最受推崇的 C++ 书籍之一
  • @Matt 你的书在这方面是对的多于错的。看完Why is “using namespace std;” considered bad practice,保持谨慎的做法会更有意义。 (你可能需要读几遍)。
猜你喜欢
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2013-05-21
  • 1970-01-01
相关资源
最近更新 更多