0925 词频统计程序的一些总结
命令空间
-
将命名空间里面的函数声明和定义分开,头文件里面只需要包含声明就好了,另外写一个.cc文件,书写函数的定义
//fun.h #ifndef TEST_H_ #define TEST_H_ namespace HW { void fun(void); } #endif //fun.cpp #include"fun.h" void HW::fun(void) { //do nothing } //main #include<iostream> #include"fun.h"//只用包含头文件就OK int main(int argc, char **argv) { HW::fun(); //或者 //using namespace HW; //fun(); return EXIT_SUCCESS; }
-
有关命名空间的详细资料可查询文章系列
统计词频程序值得借鉴的地方
- 在WordFrequency类里面设置filename_和stoplist_,使用带两个参数的构造函数初始化之,然后就可以将readstoplist(),readwordfile()放入类中,进而操作unordered_map和unordered_set.
- 在构建好了unordered_map后,再利用一个vector,压入map中的元素,将其中的元素使用sort进行排序(自己构建一个bool comp函数,可以放在新建的命名空间里)
- 使用set的count(word)函数来判断存在性
- 使用了copy(words_.begin(),words_.end(),back_inserter(sortWords_));函数来将map中的元素采用插入至最后一个元素的方式copy至vector中,注意back_inserter()函数意义为push_back,所以肯定还存在一个front_inserter()函数,相当于push_front
- typedef XX XX 既可以放在private,也可以放在public
有关reverse迭代器
- 在逻辑上,rbegin指向最后一个元素,rend指向第一个元素的前一个位置。
- 但是在实际实现上,rbegin指向最后一个元素的下一个位置,rend指向第一个元素。
- reverse迭代器的物理位置与逻辑位置差1
-
采用这种实现的好处是:将iterator转化成reverse_iterator之后的区间,与之间的区间恰好相反,但内容相同。例如[2, 7),用reverse表达是[6, 1)内,可以参照0925/iterator/2.cc
-
reverse迭代器不能用于erase函数。删除的正确方式是:it = string::reverse_iterator(s.erase((++it).base()));
STL中重要的algorithm头文件
该头文件里面包含的函数参见http://zhouyuanyuan.hi.blog.163.com/blog/static/131455102201312145530757/
-
*max_element,min_element函数找最大最小元素
使用方法:min = *std::min_element(vec.begin(), vec.end()),若元素间大小标准可以取多个,也可以添加第三个参数,基返回bool类型的comp函数指针,bool comp(const string &s1, const string &s2) { return s1.size() < s2.size();//这里return是小于号的时候,max输出最大值,min输出最小值 }
max_element(vec.begin(), vec.end(), comp);
-
for_each函数对容器里面的每一个元素进行操作
for_each(vec.begin(), vec.end(), toUpper),第三个元素为一个函数指针,指向的函数具有一个隐式参数:容器里面的元素(不是迭代器) -
find 和 find_if查找
std::find(vec.begin(), vec.end(), "dalian");返回迭代器
std::find_if(vec.begin(), vec.end(), isShorter);其中第三个参数为一个返回bool类型的函数指针,返回的也是迭代器:bool isShorter(const string &s) { return s.size() < 6; }
-
copy(),参见上面;
-
lambada表达式:for_each(vec.begin(), vec.end(), [](const string &s) { cout << s << " "; });
-
count和conut_if
int mycount = std::count (myvector.begin(), myvector.end(), 20)//返回第三个参数val出现的次数
int mycount = count_if (myvector.begin(), myvector.end(), IsOdd);//返回满足第三个参数给出的条件的次数