最近在做data mining的作业Apriori算法的实现是用到STL的知识,因为之前并未系统地用过STL库,所以在写程序时,遇到了很多问题,今天总结下,以便以后对STL有更好的使用

程序中主要用到两种数据结构:vector,map

一,vector介绍
<1>简单地说,vector是一个能够存放任意类型的动态数组,能够增加和删除数据。
<2>定义方法:vector<string> myvector;
<3>插入记录:
1,push_back(const T&);注意push_back()的参数是引用类型的,刚开始我以为在vector中插入数据只是插入一条记录的引用,并未复制该记录的实际值,后来才知道不是这样

的,vector重新为T开辟了一段内存空间,至于为什么参数是引用类型,我也不太清楚。最常用
2,myvector[2] = “mystring”;利用[]插入一条记录。
3,iterator insert(iterator pos,const T& x)  //没怎么用过
void insert(iterator pos,InputIterator f, InputIterator l)
void insert(iterator pos, size_type n, const T& x)
<4>访问记录:
1,at(int index);直接返回该位置上的记录,而且越界的话会检查的。推荐使用
2, []//类数组方式,不检查越界情况

<5>删除记录
1,pop_back();//removes the last element.
<6>其他一些常用api
1,size()// 返回vector的大小
2,begin();//返回指向vector第一位置迭代器iterator
vector<string>::iterator myvector_iterator = myvector.begin();
3,end();判断迭代器是否结束,结合begin可以对vector进行遍历
4,clear()//清空vector
5,empty()//vector是否为空

对vector进行遍历的代码

void print_debug(vector<int> data,char* str)
{
cout<<str<<endl;
vector<int>::iterator data_iterator = data.begin();
for(; data_iterator != data.end();++data_iterator)
{
cout<<*data_iterator<<” “;
}
cout<<endl;
}

二、map介绍
<1>map是STL中的关联容器,它提供了一对一的数据处理能力(key,value)对应关系;map的内部实现是一颗红黑树,所有的数据都是有序的,这个特点是hash_map所没有的。
<2>声明map:map<string,int,mycmp> mymap;//一般map的构造函数有三个参数,第一个key的类型,第二个是value的类型,第三个是”<”比较函数,对于像int型可以使用默认的比较

器,但是对于自定义的struct,必须提供比较器,否则会出现编译错误
<3>插入记录:有点复杂,我也是找了半天资料才整明白的。
1,pair:mymap.insert(pair<string,int,mycmp>(“yaron”,1));
2,value_type方式:mymap.insert(map<string,int,mycmp>::value_type(“yaron”,1));
3,数组方式:mymap["yaron"] = 1;
当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的

,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值
<4>数据遍历

map<string,int,mycmp>::iterator mymap_iterator = mymap.begin();
for(;mymap_iterator != mymap.end();++mymap_iterator)
{
cout<<mymap_iterator->first<<mymap_iterator->second<<endl;
}

<5>map的大小
int size = mymap.size();
<6>数据查找—find()//返回数据出现位置的迭代器
map<string,int,mycmp>::iterator mymap_iterator = mymap.find(“yaron”);
count(key)//返回数据出现的次数,0代表不存在
<7>记录的清空与删除
clear();//清空
erase(key);//删除
<8>比较器的实现
1,在自定义的数据结构中重载”<”运算符
2,单独实现

struct mycmp
{
bool operator()(const ItemSet p_1,const ItemSet p_2)const
{
int size = p_1.itemset.size();
int i = 0 , flag = 0;
for( i = 0 ; i < size ; ++i )
{
if( p_1.itemset[i] < p_2.itemset[i] )
{
flag = 1;
}
else if( p_1.itemset[i] > p_2.itemset[i] )
{
break;
}
}
return flag == 1 ? true:false;
}
};

本文地址:http://www.yaronspace.cn/blog/index.php/archives/205

来自yaronspace.cn  本文链接:http://yaronspace.cn/blog/archives/205