// stdafx.h
#ifndef __STDAFX_H__
#define __STDAFX_H__
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <cstring>
#include <cassert>
#include <cstdlib>
#include <cctype>
#include <cstdio>
using namespace std;
#define PAUSE pause();
#define STOP while (true) { pause(); }
#endif
// stdafx.cpp
#include "stdafx.h"
// assist.h
#ifndef __ASSIST_H__
#define __ASSIST_H__
#include "stdafx.h"
void pause(void); // 中断暂停
void sort_unique(string& str); // 将一个字符串排序后去重
#endif
// assist.cpp
#include "stdafx.h"
#include "assist.h"
void pause(void)
{
system("pause>nul");
}
void sort_unique(string& str)
{
sort(str.begin(), str.end()); // 排序
string::iterator old_end = str.end(); // 去重
string::iterator new_end = unique(str.begin(), str.end());
str.erase(new_end, old_end);
}
// ItemSet.h
#ifndef __ITEM_SET_H__
#define __ITEM_SET_H__
struct CItemSet // 项集
{
string m_seq; // 用string保存项的序列,将string当成整型数组用
// 项集中的元素统统去重并按字典序升序排列
// 构造函数
CItemSet(void) {} // 默认空的构造函数
CItemSet(string seq): m_seq(seq) {} // 直接用string构造
CItemSet(const CItemSet& obj): m_seq(obj.m_seq) {} // 复制构造函数
void split_dot_blank(char* buff); // 对输入的m_seq进行解析去掉分隔符得到数字序列
friend istream& operator>>(istream& in, CItemSet& obj); // 输入
friend ostream& operator<<(ostream& out, const CItemSet& obj); // 输出
// 比较运算符,满足STL的协议
bool operator==(const CItemSet& oth) const;
bool operator<(const CItemSet& oth) const;
int size() const; // 返回项集中项的个数
bool isEmpty(void) const; // 项集是否为空
bool isInside(const CItemSet& oth) const; // 项集this是否包含于项集&oth中
// 两个剪枝
bool operator%(const CItemSet& oth) const; // 判断this和oth是否拥有相同的前缀
bool split_appear(vector<CItemSet>& set_list) const; // k + 1项集的所有k项子集是否都出现在项集集合set_list中
// 实际中set_list将传入计算出的k频繁项集集合
CItemSet sub_set_at(int i) const; // 将项集中的第i个项拆出来单独形成一个{ ai }项并返回
CItemSet operator+(const CItemSet& oth) const; // 集合并
CItemSet operator-(const CItemSet& oth) const; // 集合减
};
#endif
// ItemSet.cpp
#include "stdafx.h"
#include "assist.h"
#include "ItemSet.h"
void CItemSet::split_dot_blank(char* buff)
{
#define IN 0 // 在数字序列中
#define OUT 1 // 不在数字序列中
char str_num[1024]; // 存放输入序列中的数字部分
int flag = OUT; // 刚开始初始化为在序列外
char seq_buff[1024]; // 用于暂存映射好的seq
int k = 0;
// i指示seq,j指示str_num
for (int i = 0, j = 0; i <= strlen(buff); i++) {
if (!ispunct(buff[i]) && !isspace(buff[i]) && buff[i] != '\0') { // 如果为数字
if (flag == OUT) {
flag = IN; // 从序列外到序列内表示新的