zoukankan      html  css  js  c++  java
  • 命名空间 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);//返回满足第三个参数给出的条件的次数

  • 相关阅读:
    Hive创建表格报Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException的错误
    Hive本地模式安装及遇到的问题和解决方案
    CentOS6 编译安装Mysql5.6.26
    数据结构全攻略--学好数据结构的必经之路
    JAVA项目打开出现红色感叹号!
    前端语言html
    1 利用Anaconda完美解决Python 2与python 3的共存问题
    0 Windows上安装Anaconda和python的教程详解
    回溯算法
    建立结构体
  • 原文地址:https://www.cnblogs.com/sunstars/p/3995866.html
Copyright © 2011-2022 走看看