算法笔记杂记——STL介绍

1.Vector的常见用法详解
    需要添加#include < vector>
    using namespace std;
    vector翻译为向量,可以理解为“长度根据需要而自动改变的数组”。
(1)定义
        vector< typename> name;
注意:vector< vector< int> > name;//>>之间要加空格
(2)访问
        ①通过下标访问
        name[0],name[1]…
        ②通过迭代器访问
        迭代器(iterator)可以理解为一种类似指针的东西,其定义:vector< typename>::iterator it;
          eg:
            vector< int> vi;
            vector< int>::iterator it = vi.begin();
     end()函数是取尾元素的下一个地址。
     迭代器的两种自加操作:++i;i++;
    只有在vector和string中,才允许使用vi.begin()+3这种迭代器加上整数的写法
(3)vector常用函数

      ①push_back(x)
          在vector后面添加一个元素x。

      ②pop_back()
          删除vector的尾元素。

      ③size()
         获得vector中元素的个数。

      ④clear()
          用来清空vector中的所有元素。

      ⑤insert()
          insert(it,x)用来向vector的任意迭代器it处插入一个元素x,it处原来元素依次后移。

      ⑥erase()
          删除单个元素、删除一个区间内的所有元素。
          eg:
          erase(it)删除It处的元素。
          erase(first,last)删除[first,last)区间内的所有元素。last为所删除区间末尾的下一位。

2.set的常见用法详解
    翻译为集合,是一个内部自动有序且不含重复元素的容器。
    使用需要添加:
        #include < set>
        using namespace std;

(1)定义
      set< typename> name;

(2)访问
      set只能用过迭代器来访问
      set< typename>::iterator it;
      使用*it来访问set里的元素。
      for(set< int >::iterator it = st.begin();it != st.end(); it++)//不支持it< st.end()的写法
      {}

(3)常见的函数
      ①insert()
        insert(x)将x插入set容器中,并自动递增排序和去重。
      ②find()
        find(value)返回set中对应值为value的迭代器。
      ③erase()
      ④size()
      ⑤clear()

3.string的常见用法详解
    处理字符串
    需要添加:
        #include< string>
        using namespace std;

(1)定义
        string str;

(2)访问
        ①str[n] 通过下标来访问。
要读入和输出整个字符串,只能用cin,cout,若要用printf,则用c_str()来对string进行类型转换
        eg:printf("%s\n",str.c_str());

        ②通过迭代器访问
           string::iterator it;

        (3)string常用函数

        ①**+=**
           拼接两个string

        ②大小比较算术符
           比较字典序
        ③length()和size()都是返回string的长度

        ④insert()
          insert(pos,string) 在pos位置插入字符串string
           insert(it,it2,it3) it为原字符串欲插入的位置,it2和it3为待插入字符串的首尾迭代器。

        ⑤erase()
           与之前相同的两种用法还有一个新用法
           str.erase(pos,length) 以pos为开始位置,删除length个字符

        ⑥clear()
           清空string中的数据

        ⑦substr()
           substr(pos,len)返回从pos号位开始,长度为len的子串。

        ⑧string::npos
          常数,其本身的值为-1,但由于是unsigned_int类型,其值也等于unsigned_int类型的最大值(4294967295)。

        ⑨find()
          str.find(str2),当str2是str的子串时,返回其在str中第一次出现的位置。如果str2不是str的子串,那么返回string::npos。
          str.find(str2,pos),从str的pos位开始匹配str2。

        ⑩replace()
          str.replace(pos,len,str2)把str从pos号位开始、长度为len的子串替换为str2。
          tr.replace(it,it2.str2),把str的迭代器[it,it2)范围的子串替换成str2。

4.map的常用用法详解
   map翻译为映射,map可以将任何的基本类型映射到任何基本类型。
   需要添加:
      #include < map>
      using namespace std;

(1)map的定义
   map< typename1,typename2> mp;
   如果是字符串到整形的映射,必须使用string而不能使用char数组。

(2)map容器内元素的访问
      ①通过下标访问
         eg:map< char,int> mp; 使用mp[‘c’]来访问他对应的值。
      ②通过迭代器访问
         it->first来访问键,it->second来访问值。
map会以键从大到小自动排序。因为map的内部是使用红黑树实现(set也是)。

(3)map常用函数

      ①find()
      find(key)返回键为key的映射的迭代器。

   ②erase()
      删除单个元素,删除一个区间内的所有元素

   ③size()
      返回map中映射的对数

   ④clear()
      清空map中的所有元素
map的键和值是唯一的,如果一个键要对应多个值。就只能用multimap。不排序用unordered_map,以散列代替红黑树实现,速度比map快。

5.queue的常见用法详解
   queue翻译为队列,先进先出的容器,
   需添加:
   #include < queue>
   using namespace std;

(1)queue的定义
   queue< typename> name;

(2)queue容器内元素的访问
   由于队列是先进先出,所以只能通过front()来访问队首元素,通过back()来访问队尾元素。

(3)queue常用函数
      ①push(x),将x进行入队。
      ②front(),back(),访问队首元素,队尾元素。
      ③pop(),令队首元素出队。
      ④empty(),检测queue是否为空。返回true则空,false则非空。
      ⑤size(),返回queue中元素的个数
使用front()和pop()函数前,必须使用empty()判断队列是否为空,否则可能因为队列为空出现错误。
deque双端队列,首尾皆可插入和删除的队列。priority_queue优先队列,使用堆实现的默认将当前队列最大元素置于队首的容器。

6.priority_queue的常见用法详解
   优先队列,队首元素一定是当前队列中优先级最高的那一个。
   需要添加:
      #include< queue>
      using namespace std;

(1)priority_queue的定义
   priority_queue < typename> name;

(2)priority_queue容器内元素的访问
   只能通过top()来访问队首元素。

(3)priority_queue常用函数
      ①push(x),令x入队。
      ②pop(),令队首元素出队。
      ③empty(),检测优先队列是否为空。
      ④size(),返回优先队列内元素的个数。

(4)基础类型的优先级设置
   一般是数字大的或者字典序大的优先级越高。
   以下的两种定义相同:
      priority_queue< int> q;
      priority_queue< int,vector < int>,less < int> > q;
   想让优先队列把最小的元素放在队首,只需进行如下定义:
      priority_queue< int, vector < int>,greater< int> > q;

(5)结构体的优先级设置
   struct fruit{
      int price;
      string name;
   };
   希望按水果的价格高为优先级高,需要重载小于号“<”。
      struct fruit{
         int price;
         string name;
         friend bool operator < (fruit f1,fruit f2){
         return f1.price < f2.price;
         }
      }
};
重载大于号会编译错误
   令一种写法:
   struct cmp{
      bool operator () (fruit f1,fruit f2){
         return f1.price<f2.price;
         }
   };
priority_queue<fruit,vector< fruit>,cmp> q;
如果结构体内的数据较为庞大,建议使用引用来提高效率
bool operator () (const fruit &f1,const fruit &f2){
   return f1.price<f2.price;
}
7.stack的常见用法详解

stack翻译为栈,是一种后进先出的容器。
   需添加:
     #include < stack>
      using namespace std;

(1)stack的定义
   stack< typename> name;

(2)stack内元素的访问
   只能通过top()来访问栈顶元素。

(3)stack的常用函数
      ①push(x),令x入栈。
      ②pop(),弹出栈顶元素。
      ③empty(),检测stack是否为空。
      ④size(),返回stack内元素的个数。

8.pair的常见用法详解
pair可以看做内部有两个元素的结构体。
   需添加:
      #include < utility>
      using namespace std;
map的头文件中包含了pair。

(1)pair的定义
   pair有两个参数,分别对应first和second的数据类型。
   pair< typeName1,typeName2> name;
      eg:
         pair<string,int> p;
         pair<string,int> p(“aaa”,1);
   临时构建:
      pair<string,int>(“aaa”,1)
      make_pair<“aaa”,1)

(2)pair的访问
   结构体的访问方式,first,second来访问。

(3)pair的常见函数
  ①比较规则,先以frist的大小作为标准,只有frist相等才去判别second的大小。

9.algorithm头文件下的常用函数

   (1)swap(x,y),用来交换x和y的值。

   (2)reverse(it,it2),可以将数组指针在[it,it2)之间的元素或容器的迭代器在[it,it2)范围内的元素进行反转。

   (3)next_permutation(),给出一个序列在全排列中的下一个序列。当到达全排列的最后一个时会返回false。

   (4)fill(),可以把数组或容器中的某一段取件赋予某个相同的值。和memset不同,fill的赋值可以是数组类型对应范围中的任意值。

   (5)sort(),在排序那篇已介绍。

   (6)lower_bound(frist,last,val),寻找数组或容器的[frist,last)范围内第一个值大于等于val的元素的位置,返回指针或迭代器。

   upper_bound(frist,last,val),寻找数组或容器的[frist,last)范围内第一个值大于val的元素的位置,返回指针或迭代器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值