该程序从txt文件中读取数字字符串,将它们转换为整数,将它们存储在向量中,然后尝试以有组织的方式输出它们,如此....
如果txt文件说:
7 5 5 7 3 117 5
Run Code Online (Sandbox Code Playgroud)
该方案产出:
3
5 3
7 2
117
Run Code Online (Sandbox Code Playgroud)
因此,如果数字不止一次出现,它会输出发生的次数.这是迄今为止的代码.
#include "std_lib_facilities.h"
int str_to_int(string& s)
{
stringstream ss(s);
int num;
ss >> num;
return num;
}
int main()
{
cout << "Enter file name.\n";
string file;
cin >> file;
ifstream f(file.c_str(), ios::in);
string num;
vector<int> numbers;
while(f>>num)
{
int number = str_to_int(num);
numbers.push_back(number);
}
sort(numbers.begin(), numbers.end());
for(int i = 0; i < numbers.size(); ++i)
{
if(i = 0 && numbers[i]!= numbers[i+1]) cout << numbers[i] << endl;
if(i!=0 && numbers[i]!= numbers[i-1])
{
cout << numbers[i] << '\t' << counter << endl;
counter = 0;
}
else ++counter;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:程序卡住了.现在正在寻找无限循环.
您可以使用数字地图来计数:
typedef map<int,unsigned int> CounterMap;
CounterMap counts;
for (int i = 0; i < numbers.size(); ++i)
{
CounterMap::iterator it(counts.find(numbers[i]));
if (it != counts.end()){
it->second++;
} else {
counts[numbers[i]] = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
...然后遍历地图以打印结果.
编辑:正如lazypython所建议的那样:如果你有TR1扩展 [wikipedia.org],unordered_map应该有更好的性能......
typedef std::tr1::unordered_map<int,unsigned int> CounterMap;
CounterMap counts;
for (int i = 0; i < numbers.size(); ++i)
{
CounterMap::iterator it(counts.find(numbers[i]));
if (it != counts.end()){
it->second++;
} else {
counts[numbers[i]] = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
如何使用地图,其中键是您要跟踪的数字,值是出现的次数?
如果你必须使用矢量,你已经对它进行了排序.所以只需跟踪您之前看到的数字.如果它与当前数字相同,则递增计数器.每次数字更改时:打印出当前数字和计数,重置计数,将last_seen数字设置为新数字.