顺序容器和简单算法

来源:互联网 发布:如何调用数组方法 编辑:程序博客网 时间:2024/05/19 18:13

容器

一、顺序容器

1、  概念

它将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,即为顺序容器。

2、类型

标准库定义了三种顺序容器的类型:vector、list、deque。

Vector相当于c语言中的数组,list相当于c语言中的链表,而deque则是双端可以插入的vector。

3、语法:

C<T> c;  建立一个空的容器

C c(c2);  把从c2中的内容复制给c

C c(b,e);  把b和e之间的内容复制给容器

容器的容器

vector<vector<string>> lines;

4、在顺序容器中的操作

       (1)将元素值复制到容器中

                c.push_back(t); //顺序容器都支持的操作

                c.push_front(t); //只适用于list和deque容器类型

                 c.insert(p,t); //在迭代器p所指向的元素前面插入值为t的新元素

       (2)访问顺序容器内元素的操作

                  c.back()//返回容器c的最后一个元素的引用

                  c.front()//返回容器c的第一个元素的引用

                  c[n]//返回下标为n的元素的引用只适用于vector和deque容器

                  c.at(n)//返回下标为n的元素的引用只适用于vector和deque容器

       (3)删除元素

                 c.erase(p) //删除迭代器p所指向的元素,返回一个迭代器,它指向被删除元素后面的元素

                 c.erase(b,e) //删除迭代器b和e所标记的范围内所有的元素

                 c.clear() //删除容器c内的所有元素,返回void

                 c.pop_back() //删除容器c的最后一个元素,返回void

                 c.pop_front() //删除容器c的第一个元素,返回void  只适用于list和deque容器

     (4)赋值与swap

               c1=c2删除容器c1的所有元素,然后将c2的元素复制给c1

               c1.swap(c2)交换内容:调用完该函数后,c1中存放的是c2原来的元素,C2中存放的则是c1原来的元素。C1和C2的类型必须相同,该函数的执行速度通常要比将c2复制到C1的操作快。

5、迭代器和迭代器范围

*iter返回迭代器iter所指向的元素的引用

iter->mem对iter进行解引用,获取指定元素中名为mem的成员,等效于(*iter).mem

vector和deque支持通过元素位置实现的随机访问,因此它们的迭代器可以有效地实现算数和关系运算。

用于计算vector对象的中点位置:

vector<int>::iterator iter = vec.begin() + vec.size()/2

list容器的迭代器既不支持算数运算(加法或减法),也不支持关系运算(<=,<,>=,>),它只提供前置和后置的自增、自减运算以及相等(不等)运算。

list<int> ilist(vec.begin(),vec.end());

ilist.begin() + ilist.size()/2; //error

6、选择容器类型的法则:

(1)如果程序要求随机访问元素,则应使用vector或deque容器

(2)如果程序必须在容器的中间位置插入或删除元素,则应采用list容器

(3)如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则采用deque容器

 

容器小结:

1、标准库的顺序容器有三个类型

vector:支持随机访问

list:不支持随机访问

deque:支持随机访问

2、  容器的常用操作:

插入:push_back(),insert()

删除:erase()

访问:back()

二、容器算法

使用泛型算法必须包含algorithm头文件:#include <algorithm>

标准库还定义了一组泛化的算数算法:#include <numeric>

1、  算法accumulate

int sum = accumulate(vec.begin(),vec.end(),42); //sum设置为vec的元素之和再加上42

string sum = accumulate(v.begin(),v.end(),string(“”));

2、  算法replace

replace(ilist.begin(),ilist.end(),0,16); //把0替换为16

3、  算法count

int times = count(ivec.begin(),ivec.end(),0); //替换出现的次数

4、  排序算法

bool cmp(int i,int j) {return i>j;}

int main()

{

vector<int> vec;

for(int i=10;i>-1;i--)

{

         Vec.push_back(i);

}

sort(vec.begin(),vec.end(),cmp);

for(int i=0;i<vec.size();i++)

{

         cout<< vec[i] << “ ”;

}

cout << endl;

return 0;

}

5、  Find_if算法

bool find_5(int i) {return i==5;}

int main()

{

           vector<int>vec;

           for(inti=0;i<10;i++)

                    vec.push_back(i);

           vector<int>::iteratorit = find_if(vec.begin(),vec.end(),find_5);

           if(it!=vec.end())

                    cout<< *it << endl;

           return 0;

}

原创粉丝点击