zoukankan      html  css  js  c++  java
  • STL学习笔记(序列式容器)

    Vector

    Vector是一个动态数组。

    1.Vector的操作函数

     构造、拷贝和析构

    vector<Elem> c           //产生一个空vector ,其中没有任何元素
    vector<Elem> c1(c2)      //产生另一个同型vector的副本,(所有元素都被拷贝)
    vector<Elem> c(n)        //利用元素的default构造函数生成一个大小为n的vector
    vector<Elem> c(n,elem)   //产生一个大小为n的vector,每个元素值都是elem
    vector<Elem> c(beg,end)  //产生一个vector,以区间[beg;end)作为元素初值
    c.~vector<Elem>()        //销毁所有元素,并释放内存

    非变动性操作

    c.size()      //返回当前的元素数量
    c.empty()     //判断大小是否为零。等同于size()==0
    c.max_size()  //返回可容纳元素的最大数量
    capacity()    //返回重新分配空间前所能容纳的元素的最大数量
    reserve()     //扩大容量
    c1 (op) c2    //判断两个vector大小,其中op可以为==、!=、<、>、<=和>=

    赋值

    c1=c2             //c2的全部元素赋值给c1
    c.assign(n,elem)  //复制n个elem,赋值给c
    c.assign(beg,end) //将区间[beg;end)内的元素赋值给c
    c1.swap(c2)       //c1和c2元素交换
    swap(c1,c2)       //同上,此为全局函数

    元素存取(如果索引越界,at()会抛出out_of_range异常,而其他函数不做检查,会引发未定义行为)

    c.at(idx)  //返回索引idx所标志的元素。如果idx越界,抛出out_of_range
    c[idx]     //返回索引idx所标志的元素。不进行范围检查
    c.front()  //返回第一个元素。不检查第一个元素是否存在
    c.back()   //返回最后一个元素。不检查最后一个元素是否存在

    迭代器相关函数

    c.begin()  //返回一个随机存取迭代器,指向第一个元素
    c.end()    //返回一个随机存取迭代器,指向最后元素的下一位置
    c.rbegin() //返回一个逆向迭代器,指向逆向迭代的第一个元素
    c.rend()   //返回一个逆向迭代器,指向逆向迭代的最后元素的下一位置

    vector迭代器持续有效,除非发生两种情况:

    1.使用者在一个较小索引位置上安插或移除元素,

    2.由于容量变化而引起内存重新分配。

    安插和移除元素

    c.insert(pos,elem)   //在pos位置上插入一个elem副本,并返回新元素位置
    c.insert(pos,n,elem) //在pos位置上插入n个elem副本。无回传值
    c.insert(pos,beg,end)//在pos位置上插入区间[beg;end)内的所有元素的副本。无回传值
    c.push_back(elem)    //在尾部添加一个elem副本
    c.pop_back()         //移除最后一个元素(但不回传)
    c.erase(pos)         //移除pos位置上的元素,返回下一元素的位置
    e.resize(num)        //将元素数量改为num(如果size()变大了,多出来的新元素都是elem的副本)
    c.clear()            //移除所有元素,将容器清空

    安插元素和移除元素都会使“作用点”之后的个元素的references、pointers、iterators实效。

    如果安插操作引发内存重新分配,那么该容器身上的所有reference、pointers、iterators都会实效。

    2.Vector运用实例

     1 #include <iostream>
     2 #include <vector>
     3 #include <string>
     4 #include <algorithm>
     5 #include <iterator>
     6 using namespace std;
     7 
     8 int main()
     9 {
    10     vector<string> sentence;
    11     sentence.push_back("hello,");
    12     sentence.push_back("how");
    13     sentence.push_back("are");
    14     sentence.push_back("you");
    15     sentence.push_back("?");
    16     copy(sentence.begin(),sentence.end(),ostream_iterator<string>(cout," "));
    17     cout<<endl;
    18     cout<<" max_size(): "<<sentence.max_size()<<endl;
    19     cout<<" size(): "<<sentence.size()<<endl;
    20     cout<<" capacity(): "<<sentence.capacity()<<endl;
    21     swap(sentence[1],sentence[3]);
    22     sentence.insert(find(sentence.begin(),sentence.end(),"?"),"always");
    23     sentence.back()="!";
    24     copy(sentence.begin(),sentence.end(),ostream_iterator<string>(cout," "));
    25     cout<<endl;
    26     cout<<" max_size(): "<<sentence.max_size()<<endl;
    27     cout<<" size(): "<<sentence.size()<<endl;
    28     cout<<" capacity(): "<<sentence.capacity()<<endl;
    29 }
    View Code

    Deque

    1.deque的操作

    容器deque和vector非常相似。不同的是deque的动态数组头尾都开放,因此能在头尾连孤单进行快速安插和删除。

    deque和vector的接口几乎一样,一方面不同的是deque具有操作头部元素的能力:

    c.push_front(elem)  //在头部插入elem的一个副本
    c.pop_front()       //移除头部元素(但不回传)

    另一方面,deque不提供容量操作(capacity()和reserve())。

    元素的插入和删除可能导致内存重新分配,所以任何插入和删除动作都会使锁有指向deque元素的pointers、references和iterators实效。

    唯一例外是在头部或尾部插入元素,动作之后,pointers和refercences依然有效。

    2.Deque运用实例

     1 #include <iostream>
     2 #include <deque>
     3 #include <string>
     4 #include <algorithm>
     5 #include <iterator>
     6 using namespace std;
     7 int main()
     8 {
     9     deque<string> coll;
    10     coll.assign(3,string("string"));
    11     coll.push_back("last string");
    12     coll.push_front("first string");
    13     copy(coll.begin(),coll.end(),ostream_iterator<string>(cout,"
    "));
    14     cout<<endl;
    15     coll.pop_front();
    16     coll.pop_back();
    17     for(int i=1;i<coll.size();++i)
    18         coll[i]="another "+coll[i];
    19     coll.resize(4,"resized string");
    20     copy(coll.begin(),coll.end(),ostream_iterator<string>(cout,"
    "));
    21 }
    View Code

    List

    List使用一个doubly linked list(双向链表)来管理元素。

    List的内部结构和vector或deque截然不同,主要有以下区别:

    1.Lists不指出随机存储

    2.任何位置上执行元素的安插和移除都是在常数时间内完成,因为无需移动任何其他元素。

    3.安插和删除动作并不会造成指向其他元素的各个pointers、references、iterators实效。

    4.Lists并为提供容量、空间分配等函数。

    1.List的操作函数

    list的生成、复制和销毁动作和所有序列式容器相同。

    元素存取

    list不支持随机存取,只有front()和back()能够直接存取元素

    元素的安插和移除

    lists提供deques的所有功能。为了移除元素,lists特别配备了remove()算法的特别版本。

    c.remove(val)   //移除所有其值为val的元素
    c.remove_if(op) //移除所有”造成op(elem)结果为true“的元素

    List的特殊变动性操作

    c.unique()                     //如果存在若干相邻而数值相等的元素,就移除重复元素,只留下一个
    c.unique(op)                   //如果存在若干相邻元素,都使op()结果为true,则移除重复元素,只留下一个
    c1.splice(pos,c2)              //将c2内所有元素转移到c1之内、迭代器pos之前
    c1.splice(pos,c2,c2pos)        //将c2内c2pos所指元素移到c1内的pos所指位置上(c1和c2可相同)
    c1.splice(pos,c2,c2beg,c2end)  //将c2内的[c2beg;c2end]区间内所有元素转移到c1内的pos之前(c1和c2可相同)
    c.sort()                       //以operator<为准则,对所有元素排序
    c1.merge(c2)                   //假设c1和c2容器都包含已序元素,将c2的全部元素转移到c1,并保证合并后的list仍为已序
    c1.merge(c2,op)                //假设c1和c2容器都包含op()原则下的已序元素,将c2的全部元素转移到c1,并保证合并后list在op()原则下仍为已序
    c.reverse()                    //将所有元素反序

    2.List运用实例

     1 #include <iostream>
     2 #include <list>
     3 #include <algorithm>
     4 #include <iterator>
     5 using namespace std;
     6 
     7 void printLists(const list<int>& l1,const list<int>& l2)
     8 {
     9     cout<<"list1: ";
    10     copy(l1.begin(),l1.end(),ostream_iterator<int>(cout," "));
    11     cout<<endl;
    12     cout<<"list2: ";
    13     copy(l2.begin(),l2.end(),ostream_iterator<int>(cout," "));
    14     cout<<endl;
    15 }
    16 
    17 int main()
    18 {
    19     list<int> list1,list2;
    20     for(int i=0;i<6;++i)
    21     {
    22         list1.push_back(i);
    23         list2.push_front(i);
    24     }
    25     printLists(list1,list2);
    26     list2.splice(find(list2.begin(),list2.end(),3),list1);
    27     printLists(list1,list2);
    28     list2.splice(list2.end(),list2,list2.begin());
    29     printLists(list1,list2);
    30     list2.sort();
    31     list1=list2;
    32     list2.unique();
    33     printLists(list1,list2);
    34     list1.merge(list2);
    35     printLists(list1,list2);
    36 }
    View Code
  • 相关阅读:
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Python位运算符
  • 原文地址:https://www.cnblogs.com/runnyu/p/4816391.html
Copyright © 2011-2022 走看看