C++-如何计算同一字符串在列表中出现的次数

C++ - How to count how many times occur the same string in a list

本文关键字:列表 字符串 何计算 计算 C++-      更新时间:2023-10-16

我在谷歌和stackoverflow上搜索了很多,但都找不到答案。事实上,我正在读一本C++书(C++初级读本第五版(,他们让我做一个练习。

"编写一个程序,读取几个事务,并计算每个ISBN发生的事务数量"(控制台项目(

这是我的代码atm:

Sales_item currentItem, item;
if (cin >> currentItem)
{
    int cnt = 1;
    while (cin >> item)
    {
        if (currentItem.isbn() == item.isbn())
        {
            ++cnt;
        }
        else
        {
            cout << currentItem.isbn() << " occurs " << cnt << " times " << endl;
            cnt = 1;
            currentItem = item;
        }
    }
cout << item.isbn() << " occurs " << cnt << " times " << endl;
}

我不会解释交易是如何运作的,所以我会用另一种方式问它。

我在控制台中键入6个(或更多(随机字符串,例如:

101A
102A
101A
101A
103A
102A

我希望结果(输出(是:

101A occurs 3 times.
102A occurs 2 times.
103A occurs 1 times.

你会怎么做?

使用std::map而不是list会更容易。

int main()
{
  map<string,int> stringMap;
  for (int i=0;i<3;i++)
  {
    cout<<"Enter string: ";
    string s;
    cin>>s;
    if(stringMap.find(s)!=stringMap.end())
    {
      stringMap[s]++;
    }
    else
    {
      stringMap[s]=1;
    }
  }
  for (map<string,int>::const_iterator itr = stringMap.cbegin();  itr!=stringMap.cend(); ++itr)
  {
    if(itr->second > 1)
       cout<<itr->first << " occurs "<<itr->second<<" times"<<endl;
    else
       cout<<itr->first << " occurs "<<itr->second<<" time"<<endl;
  }

  return 0;
}

这样的问题有多种方法,所以最好的方法取决于您的约束。我的方法是:

while(GetInputString(str)) {
  myStruct* ptr = existingList.Find(str);
  if (!ptr) {
    existingList.Add(str);
  } else {
    ptr->IncrementCount();
  }
}

我试着不为你解决你的问题——希望答案能给你一个模板。。。

    #include <iostream>
#include <vector>
#include "Sales_item.h"
using namespace std;
void book_transactions(string isbn, int count);
int main()
{
   vector<Sales_item> book_vec;
   Sales_item book;
   int total_transactions = 1;
   // Reads in Sales_item objects
   while (cin >> book)
   {
       book_vec.push_back(book);
   }
   // Compares ISBNs in vector, if two isbns are equal total transactions increases
   for (int i = 0; i < book_vec.size() - 1; i++)
   {
       if (book_vec[i].isbn() == book_vec[i+1].isbn())
       {
          total_transactions = book_vec[i].get_units_sold() + book_vec[i+1].get_units_sold();
          book_transactions(book_vec[i].isbn(), total_transactions);
       }
   }
}
void book_transactions(string isbn, int count)
{
    cout << "ISBN: " << isbn << " " << "Transactions: " << count << endl;
}
  • 我进入Sales_item.h类,添加了一个方法来获取售出的单元数。private下已经有一个类成员(未签名的返回类型(。我刚刚创建了一个getter,然后创建了Sales_items的向量。这个解决方案似乎奏效了。我确信预期的问题不适用于N组sales_items,但这应该是一个"管道胶带"解决方案。在这一点上没有必要到处乱投。一个简单的矢量数组和一个比较相邻对象的算法可以很好地工作