命名空间 algorithm头文件 reverse迭代器的erase<<0925

0925 词频统计程序的一些总结

命令空间

  1. 将命名空间里面的函数声明和定义分开,头文件里面只需要包含声明就好了,另外写一个.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;
     }
    
  2. 有关命名空间的详细资料可查询文章系列

统计词频程序值得借鉴的地方

  1. 在WordFrequency类里面设置filename_和stoplist_,使用带两个参数的构造函数初始化之,然后就可以将readstoplist(),readwordfile()放入类中,进而操作unordered_map和unordered_set.
  2. 在构建好了unordered_map后,再利用一个vector,压入map中的元素,将其中的元素使用sort进行排序(自己构建一个bool comp函数,可以放在新建的命名空间里)
  3. 使用set的count(word)函数来判断存在性
  4. 使用了copy(words_.begin(),words_.end(),back_inserter(sortWords_));函数来将map中的元素采用插入至最后一个元素的方式copy至vector中,注意back_inserter()函数意义为push_back,所以肯定还存在一个front_inserter()函数,相当于push_front
  5. typedef XX XX 既可以放在private,也可以放在public

有关reverse迭代器

  1. 在逻辑上,rbegin指向最后一个元素,rend指向第一个元素的前一个位置。
  2. 但是在实际实现上,rbegin指向最后一个元素的下一个位置,rend指向第一个元素。
  3. 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/

  1. *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);

  1. for_each函数对容器里面的每一个元素进行操作
    for_each(vec.begin(), vec.end(), toUpper),第三个元素为一个函数指针,指向的函数具有一个隐式参数:容器里面的元素(不是迭代器)

  2. 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;
    }
    
  3. copy(),参见上面;

  4. lambada表达式:for_each(vec.begin(), vec.end(), [](const string &s) { cout << s << " "; });

  5. count和conut_if
    int mycount = std::count (myvector.begin(), myvector.end(), 20)//返回第三个参数val出现的次数
    int mycount = count_if (myvector.begin(), myvector.end(), IsOdd);//返回满足第三个参数给出的条件的次数

原文地址:https://www.cnblogs.com/sunstars/p/3995866.html