如何重置标准::计数返回值

How to reset std::count return value

本文关键字:返回值 标准 何重置      更新时间:2023-10-16

std::count 返回一个值,我需要在执行内部 for 循环后将变量"counter"中的所有字符的值重置为 0。目标是计算一个角色出现的次数。如果此字符在字符串中出现两次,请将一个添加到变量"d"中。如果它出现三次,则向变量"e"添加一个。

不确定还有什么可以尝试的,或者是否有更好的功能来实现我的结果。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstring>
int main() {
    std::string data;
    std::vector<std::string> myString;
    std::vector<char> myChar;
    int d = 0, e = 0;
    std::ifstream inFile;
    inFile.open("C:\Users\Administrator\Desktop\c++ files\input2.txt");
    if (!inFile) {
        std::cout << "oops";
    }
    for (int i = 0; i < 1; i++) {
            inFile >> data;
            std::copy(data.begin(), data.end(), std::back_inserter(myChar));    //copy from string data to vector myChar via back inserter.
            char counter = 'a';
            for (int i = 0; i < 26; i++) {
                int myCount = std::count(myChar.begin(), myChar.end(), counter);
                if (myCount == 2) {
                    d++;
                }
                else if (myCount == 3) {
                    e++;
                }
                std::cout << "Counter : " << counter << " myCount : " << myCount << "n";
                counter++;
            }
        }
        std::cout << "d is: " << d << "n";
        std::cout << "e is: " << e << "n";
        return 0;

}

输入文件 -- https://adventofcode.com/2018/day/2

该程序在第一个内部 for 循环上正常工作,但在第二个和之后的返回值对于"myCount"变量来说太高(尽管正确(。

std::count不仅给你一个随机值,它还根据你给它的范围的内容给你一个特定的值。你不能改变这种行为,你不应该改变。

相反,看看这个范围。为什么std::count会给出您意想不到的值?它们要么"太高",要么"正确",不能两者兼而有之;幸运的是,他们是后者。

这是因为您反复std::back_insert循环内的向量。随着循环的进行,您不断计算上次的旧字符!

如果您首先清除myChar那么您就不会遇到问题。或者,理想情况下,将myChar声明带入循环。

一些修复

1( 出现错误时,程序应结束,而不是继续:

if (!inFile)
{
    std::cout << "oops";
    return 1;
}

2( a( myChar 正在累积所有以前读取的单词的所有字符,因此在使用循环的每次传递之前都必须清除它,最好将其声明移动到所需的块中;

b( 如果您只是使用计数器进行计数但不使用它,最好迭代数据 - 在这种情况下,摆脱i并使用字符checked_char进行迭代:

while (inFile >> data)
{
    std::vector< char > myChar;
    std::copy(data.begin(),
              data.end(),
              std::back_inserter(myChar)); //copy from string data to vector myChar via back inserter.
    for (char checked_char = 'a'; checked_char <= 'z'; ++checked_char)
    {
        int myCount = std::count(myChar.begin(), myChar.end(), checked_char);
        if (myCount == 2)
        {
            d++;
        }
        else if (myCount == 3)
        {
            e++;
        }
        std::cout << "Counter : " << checked_char << " myCount : " << myCount << "n";
    }
}