我的文件内容是:
1,2,5
2,4
2,3
1,2,4
1,3
2,3
1,3
1,2,3,5
1,2,3
我的代码是:
#include<iostream>
#include<set>
#include<vector>
#include<fstream>
#include<sstream>
#include<set>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct store {
string a;
int count;
};
int main() {
store ap[100];
vector<string> v;
set<string> input;
int mycount;
ifstream fin("trans.txt");
string line, s, str1, token;
while(!fin.eof()) {
fin >> line;
// cout<<"i cant understand but correct"<<line<<endl;
istringstream str1(line);
while(getline(str1, token, ',')) {
//cout<<"the token are\t"<<token<<endl;
v.push_back(token);
input.insert(token);
}
//v.push_back(token);
//input.insert(token);
int i = 0;
for(set<string>::iterator it = input.begin(); it != input.end(); it++) {
mycount = count(v.begin(), v.end(), *it);
s = *it;
ap[i].a = s;
ap[i].count = mycount;
cout << ap[i].a << "\t" << "mycount" << ap[i].a << endl;
i++;
}
}
}
我正在实施Apriori算法,每一行代表一个事务,即存储在文件中的项目我的文件由这样的数字组成,如何存储每个数字的出现次数及其数量
我的输出应该是这样的:
1 6
2 7
3 7
4 2
5 2
但是我不能单独存储我的意思是1和它的所有出现2及其出现的所有等等。
可以告诉我如何存储如上例子
答案 0 :(得分:4)
如果您正在阅读的数字在一个小范围内(例如0-10,甚至0-200等),而不是使用[std::map
(http://en.cppreference.com/w/cpp/container/map),您可以使用简单数组。
Map的关键是数组索引,map的值(即occurrence数)是该索引的数组值。
例如数字3的出现存储在索引3的整数数组中。
有关详细信息,请参阅以下注释代码。
我使用VS2010 SP1(VC10)编译了该代码并执行了它,它似乎正常工作(至少对于您的输入文件示例数据)。
#include <cstdlib>
#include <exception>
#include <fstream>
#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>
using namespace std;
int main()
{
static const int kExitOk = 0;
static const int kExitError = 1;
try
{
// Open text file for reading
ifstream inFile("data.txt");
// Occurrence table
static const int kMaxNum = 10;
int occurrences[kMaxNum + 1] = {0}; // init to 0s
// Line read from file
string line;
// For each line in file
while (getline(inFile, line))
{
// Process each line content using string streams
istringstream iss(line);
// Read numbers (separated by comma) from current line
string token;
while (getline(iss, token, ','))
{
// Convert from string to integer
const int num = atoi(token.c_str());
// Just do a bounds checking for safety...
if (num < 0 || num > kMaxNum)
throw runtime_error("Bad input number found in file.");
// Update occurrence of given number
occurrences[num]++;
}
}
// Print occurrences
for (int i = 0; i <= kMaxNum; i++)
{
if ( occurrences[i] != 0 )
{
cout << i << ' ' << occurrences[i] << '\n';
}
}
return kExitOk;
}
catch(const exception& e)
{
cerr << "\n*** ERROR: " << e.what() << endl;
return kExitError;
}
}
如果您想使用std::map
,只需添加#include <map>
,然后将数组定义替换为:
// Occurrence table
map<int, int> occurrences;
您可以使用以下代码打印地图内容:
// Print occurrences
for (auto it = occurrences.begin(); it != occurrences.end(); ++it)
{
cout << it->first << ' ' << it->second << '\n';
}
请注意,使用std::map
事件更新代码与数组案例正式相同:
// Update occurrence of given number
occurrences[num]++; // works also for std::map
答案 1 :(得分:3)
我从一个ctype_facet开始,它将除了数字之外的所有内容(以及可选的-
)分类为&#34;空格&#34;,因此当您阅读时,它将被完全跳过数据:
struct number_only: std::ctype<char> {
number_only() : std::ctype<char>(get_table()) {}
static mask const *get_table() {
static std::vector<mask> rc(table_size, space);
std::fill_n(&rc['0'], 10, digit);
rc['-'] = punct;
return &rc[0];
}
};
通过这种方式,阅读数据变得更加直接 - 我们不必做任何事情来忽略逗号,因为从流中提取int将自动为我们做到这一点。一旦我们读完它们,我们只需在地图中增加它们的计数,然后打印出地图:
typedef std::pair<int, int> count;
std::ostream &operator<<(std::ostream &os, count const &p) {
return os << p.first << "\t" << p.second;
}
int main() {
std::map<int, int> numbers;
int temp;
std::cin.imbue(locale(local(), new number_only);
while (std::cin >> temp)
++numbers[temp];
std::copy(numbers.begin(), numbers.end(),
std::ostream_iterator<count>(std::cout, "\n"));
}
答案 2 :(得分:1)
您应该考虑使用地图,其中键是数字,以及数值。
http://www.cplusplus.com/reference/map/map/
它基本上可以让你做类似的事情。我知道这不是有效的C ++ :)但它应该让你知道我的意思。
std::map<int, int> numbers;
for (read number from file) {
numbers[number from file] = numbers[number from file] + 1;
}