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

时间:2014-05-05 05:01:45

标签: c++ count

我在google和stackoverflow上搜索了很多,但我无法找到答案。我实际上正在读一本C ++书(C ++ Primer 5th Edition),他们要我做一个练习。

"编写一个程序,读取多个事务并计算每个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.

你会怎么做?

3 个答案:

答案 0 :(得分:0)

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

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

我已经尝试过不为你解决问题 - 希望答案能为你提供一个模板......

答案 1 :(得分:0)

使用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;
}

答案 2 :(得分:0)

    #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类并添加了一个方法来获取销售的单位数量。私有下已经有一个类成员(无符号返回类型)。我刚刚创建了一个getter,然后创建了一个Sales_items向量。这个解决方案似乎有效。我确定预期的问题不适用于N套sales_items,但是这应该作为“管道胶带”解决方案。此时无需使用指针。一个简单的矢量数组和一个比较相邻对象的算法就可以了。