算法如下:单词按照字母进行排序,单词间进行排序,这样相同标识的单词聚集到一起
这里用C++来写了。
这里主要是用到了map关联容器。因为对于每一个单词的标识就相当于是一个键,而单词本身就相当于是值。所以这是很明显的map容器。然后就是map容器可以使用下标操作访问。使用下标操作访问map容器与使用下标操作访问数组或者是vector的行为截然不同,用下标访问不存在的元素的时候将导致在map容器中添加一个新的元素,它的键就是该下标值。
对map迭代器进行解引用时,讲产生一个pair类型的对象,它的first成员存放键而且是const,它的second成员存放值。例如map<string,int>::iterator iter.如果要访问键值和值那么同pair类型一样。iter->first访问键值,iter->second访问具体值。
对于程序中用到的点操作符和箭头操作符的区别作下面的说明:
通俗的说就是:c++中当定义类对象是指针对象时候,就需要用到->指向类中的成员;当定义一般对象时候时就需要用到"."指向类中的成员
箭头操作符左边是指针,点操作符左边是实体。如果p是指针, p->function();
记住-〉必须是指针,点操作符左边必须是对象或者结构体,一般是类对象
比如:容器的迭代器iter。iter->function() = (*iter).function();
结构体:结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型。第二,相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。
- void gen_label(vector<string> &dict, map<string, vector<string> >&rec)
- {
- for (int i = 0; i < dict.size(); ++i)
- {
- string line = dict[i];
- sort(line.begin(), line.end()); //对单词中的字母进行排序,排序后的结果就作为标识,如果是变位词那么排序后有相同标识
- rec[line].push_back(dict[i]);
- } //对于单词也进行排序,这里的排序是因为当某个键不存在时,map容器会插入这个新的键,而且是按照字典顺序排序的,所以这里map容器会 //自动的把键的顺序排好,这里就实现了把标志的排序。并且把同样标志的词放入到一个map容器中
- for (map<string, vector<string> >::iterator iter = rec.begin();iter != rec.end(); ++iter)
- {
- cout<<iter->first<<":"; //输出单词的标志
- for(vector<string>::iterator itervec=iter->second.begin();itervec<iter->second.end();itervec++)
- cout<<*itervec<<" "
- cout << endl;
- }
- }