容器(上)

 

顺序容器和关联容器。STL为容器的遍历提供了迭代器。STL也提供了100多种算法的实现。这些算法包括有排序、遍历等。

 

(面试题)什么是容器:

对象必须是同一类型,而且该类型必须是可拷贝构造和可赋值的,所以包括的类型有内置的基本数据类型和带有公用拷贝构造函数和复制操作符的类。

 

(面试题)有哪几种顺序容器:

       顺序容器,指的是将一组具有相同类型T的对象,以严格的线性形式组织在一起的容器。包括vector<T>、deque<T>和list<T>等三种顺序容器。

连续的数组方式存储的,所以可以通过v[i]的方式访问vector中的元素,vector的访问时间是非常小的。而在对特定的值进行访问时,只能通过遍历vector的方式进行比较,这样的操作会导致较大的时间开销。同时vector把后面的元素复制一遍甚至于重新分配数组。因此,在随机插入方面vector相对来说性能比较低。


#include <iostream>
#include <vector>
using namespacestd;
 
int main(){
       vector<int>ivec;
       for(size_t i = 0; i < 11; i++)
       {
              ivec.push_back(i);
              cout<< "size="<< ivec.size() << "\t"
                     <<"capacity=" << ivec.capacity() <<endl;
       }
       while(ivec.size() != ivec.capacity())
       {
              ivec.push_back(0);
       }
       cout<< "当前容量已经用完:" << endl;
       ivec.push_back(0);
       //容器已经满了,即size=capacity,那么再给vector添加元素时,不得不重新开辟一段空间,并把原来的值复制过去。新开辟的空间大小等于原空间大小的1.5倍。
       cout<< "size= "<< ivec.size() << "\t"
              <<"capacity = " << ivec.capacity() <<endl;
       return0;
}

运行结果:

 

定义容器相关内容的标准有哪些 容器包含什么_定义容器相关内容的标准有哪些

访问vector中的数据有如下两种方法:

vector::at();

vector::operator[];

       operator[] 主要是为了与C语言进行兼容。如果使用该操作可以像C语言数组一样操作。但at()是首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个异常,而operator[] 则不会。因此operator[] 容易造成一些错误,一般不使用它。



#include <iostream>
#include <vector>
using namespacestd;
 
int main(){
      
       vector<int> v;
       v.reserve(10);
       for(int i = 0; i < 7;i++)
       {
              v.push_back(i);
       }
       try
       {
              intival1 = v[7];
              intival2 = v.at(7);
       }
       catch(const exception&e)
       {
              cout<< e.what();
       }
 
       return0;
}

同样vector提供了erase(), pop_back(), clear() 来删除数据。当删除数据的时候,需要知道删除尾部的数据,或者是删除所有数据,还是个别的数据。

 

eque容器:是一个双端队列,存放的数据不是以连续的形式存放的,其操作接口和vector类似。

 

list容器:一种链表的实现,储存的元素是通过使用双向链表实现的,双向链表中的每个结点存储一个元素。优势在于在list的任意位置进行插入和删除时,非常的快速,查找和随机存储时需要耗费更大的开销。