【问题标题】:How to loop through arrays in my basic calculator如何在我的基本计算器中循环遍历数组
【发布时间】:2018-07-10 20:14:35
【问题描述】:

所以我有这段代码,我很困惑如何通过将元素的数量放入循环条件中来循环遍历由字符组成的数组的大小,而不必手动输入一个数字,比如说“i

我尝试使用 std:array 并通过 for-range 循环传递它,但这并没有给我带来太多成功。

#include <iostream>
using namespace std;

int main() 
{
    int r = 0;
    while (r == 0)
    {
        char op;
        float num1, num2;
        char operators[] = { '+', '-', '*', '/' };
        bool check1 = false;

        cin >> num1;

        cin >> op;

        for (int i = 0; i < 4; i++) 
        {
            if (op == operators[i]) {
                check1 = true;
                break;
            }
        }...

抱歉 :) 仍在学习如何正确发布代码

【问题讨论】:

  • 基于范围的for 循环有什么问题?
  • 你指的是什么success?社会地位、金钱、权力还是其他什么?
  • 如果将operators重新定义为std::vector&lt;char&gt;,则可以使用operators.size()查询向量的长度。此外,这使您可以编写更清晰的基于范围的 for 循环:for (char ch : operators){ if (op == ch){ check1 = true; break; } }
  • @alterigel 基于范围的for 循环也适用于 C 样式数组(当它们不衰减为指针时)
  • 所以我尝试了:for(const char &amp;ops : operators) { ...same code as in other foor loop },但我无法弄清楚出了什么问题。

标签: c++ arrays loops calculator elements


【解决方案1】:
#include <iostream>
using namespace std;

int main() 
{
    int r = 0;
    while (r == 0)
    {
        char op;
        float num1, num2;
        char operators[] = { '+', '-', '*', '/' };
        int size=*(&operators +1)-operators;
        bool check1 = false;

        cin >> num1;

        cin >> op;

        for (int i = 0; i < size; i++) 
        {
            if (op == operators[i]) {
                check1 = true;
                break;
            }
        }...

这适用于所有一维数组。 这是如何工作的?指针

&operators ==> 指向由 4 个元素组成的数组的指针。

(&operators + 1) ==> 前面 4 个字符的地址为 指针类型是指向数组的指针 4 个字符。

*(&operators + 1) ==> 与 (&operators + 1) 相同的地址,但是 指针的类型是“char *”。

*(&operators + 1) - 运算符 ==> 因为 *(&operators + 1) 点 到地址 4 char 领先于运营商,差异 两者之间是4。

【讨论】:

  • 谢谢你这工作完美!你能解释一下大小是如何工作的吗?它如何获得这些数组中正确数量的元素?
  • 您好,如果此答案对您有用,请确保支持并接受。我将编辑我的答案以解释它。
  • 因此,由于我的指针类型是具有 4 个元素的数组指针,当我有 +1 时,它指向地址 4 个字符。如果我理解正确的话,如果它是 5 个元素而不是 4 个元素,同样适用,这意味着前面有 5 个元素?如果我是对的,*(&operators + 1) 得到的实际值为 8?所以 size 等于 4?
  • NO.operators 的类型为char *,而&amp;operators+1 的类型为char (*)[size]。所以要使两个操作数的类型相同(char*),我们需要*(&amp;operators+1)
【解决方案2】:
#include <iostream>
using namespace std;

int main() 
{
    int r = 0;
    while (r == 0)
    {
        char op;
        float num1, num2;
        char operators[] = { '+', '-', '*', '/' };
        bool check1 = false;

        cin >> num1;

        cin >> op;

        for (int i = 0; i < sizeof(operators); i++) 
        {
            if (op == operators[i]) {
                check1 = true;
                break;
            }
        }...

它只适用于字符数组,如果你想为另一个数据类型数组做,只需将 sizeof() 函数除以数据类型的大小

【讨论】:

    【解决方案3】:

    您可以使用std::beginstd::end。函数在迭代器头中定义。

    通过使用这些函数,您将能够获得数组开头和结尾的迭代器,并且您还可以更轻松地将容器替换为 std::vectorstd::array 或 @987654325 的运算符@。

    #include <iterator>
    int main()
    {
        char arr[] = {/*Some content*/};
        for(auto it = std::begin(arr); it != std::end(arr); ++it)
        {
            //Do things here...
        }
    }
    

    迭代器标头还包含一些其他用于查找迭代器之间距离的函数,因此如果您真的只想要数组的大小,那么auto size = std::distance(std::begin(arr), std::end(arr)); 将找到数组开头和结尾之间的距离,即大小。

    在你的代码中的应用是:

    #include <iostream>
    #include <iterator>
    
    int main()
    {
        int r = 0;
        while(r == 0)
        {
            char op;
            float num1, num2;
            char operators[] = {'+', '-', '*', '/'};
            bool check1 = false;
    
            std::cin >> num1;
            std::cin >> op;
            for(auto it = std::begin(operators); it != std::end(operators); ++it)
            {
                if (op == *it)
                {
                    check1 = true;
                    break;
                 }
            } ...
    

    由于此代码现在使用迭代器,这也意味着您可以使用标准库定义的基于范围的算法。算法头包含std::find 函数,可以在您的代码中按如下方式使用。

    #include <iostream>
    #include <iterator>
    
    int main()
    {
        int r = 0;
        while(r == 0)
        {
            char op;
            float num1, num2;
            char operators[] = {'+', '-', '*', '/'};
            bool check1 = false;
    
            std::cin >> num1;
            std::cin >> op;
            check1 = std::count(std::begin(operators), std::end(operators), op);
            ...
    

    我建议熟悉 C++ 中的迭代器,因为它们在 STL 中被广泛使用。最后一行计算数组中与数组开头和结尾之间等于op的元素,然后将数字转换为布尔值,因此如果没有找到,您将得到false;但是,您可以将std::count 替换为std::find,但这需要您检查搜索是否成功,例如check1 = std::find(std::begin(operators), std::end(operators), op) != std::end(operators);

    【讨论】:

    • 所以我可以这样做 for(auto size = std::distance(std::begin(arr), std::end(arr)) : operator) {...} ?
    • 确实如此。或者,如果您只想遍历所有元素,那么您可以取消引用迭代器,而它不等于结束迭代器。
    • 抱歉,我无法识别您评论中的循环。 const auto size = std::distance(std::begin(operators), std::end(operators));会给你尺寸,所以现在可以编写循环 for(auto i = 0; i
    • 但我只想要一个循环遍历所有元素,而无需在添加新元素时手动更改数字,从而增加其中的元素数量。如何在 for 循环中定义“大小”?我可以执行 for range 循环来遍历数组吗?
    • 您实际上并不需要大小,您只需要数组的开头和结尾,这就是 begin 和 end 函数将提供的。你可以从头到尾循环遍历数组。
    猜你喜欢
    • 2021-10-26
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多