如何在我的基本计算器中遍历数组

How to loop through arrays in my basic calculator

所以我有这段代码,我很困惑如何通过将元素的数量放在循环条件中来遍历由字符组成的数组的大小,而不必手动输入一个数字,比如 "i < 4" 而是使用数组本身并检查其大小。

我尝试使用 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;
            }
        }...

抱歉,我的意图:)仍在学习如何post正确编码

#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() 函数除以数据类型的大小

#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 个字符 领先于运营商,差异 两者之间是 4。

您可以使用 std::beginstd::end。这些函数在迭代器 header.

中定义

通过使用这些函数,您将能够获得指向数组开头和结尾的迭代器,并且您还能够更轻松地将容器替换为 std::vectorstd::arraystd::set.

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

迭代器 header 还包含一些其他函数,用于查找迭代器之间的距离,因此如果您真的只想要数组的大小,那么 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;
             }
        } ...

由于此代码现在使用迭代器,这也意味着您可以使用标准库定义的基于范围的算法。算法 header 包含 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 的元素,然后将数字转换为 bool,因此如果没有找到,您将得到 false;但是,您可以将 std::count 替换为 std::find 但它会要求您检查搜索是否成功 check1 = std::find(std::begin(operators), std::end(operators), op) != std::end(operators);.