底层原理:数据组或指针
介绍:元素是线性存储的,可以通过迭代器顺序访问
底层原理:二叉树、红黑树 ,时间复杂第最高log N
(补充:兼容性比较差的有hash_map、hash_set)
介绍:底层实现都是红黑树,默认情况下升序排列,不能修改关键字的值,支持双向访
问迭代器
底层原理:哈希表
介绍:底层实现都是哈希表,查找时间复杂度O(1),存放元素是无序的,对于自定
义类型必须给出哈希函数,支持前向访问迭代器
此外还有: stack / queue / priority_queue / string / bitset (通常bool类型只有一个字节,处理位集合更容易一些)
针对不同容器还有特殊的要求
①对于序列式容器,元素必须有默认的构造函数
②对于某些操作,元素需要定于 == std::find
③对于关联式容器,排序默认的是std::less
④无顺序容器,必须要提供一个hash函数 ==
⑤stl容器里面存的是元素的值而不是引用
vector<int>number;
vector<int> number(10,1);
vector<int>::iterator it;
for(it=number.gegin();it!=number.end();++it)
{
cout<<*it<<" ";
}
cout<<endl;
int arr[10]={1,5,7,9,4,6,8,2,1,20};
vector<int> number(arr,arr+10);
auto it2 = number.begin();
for(;it2!=number.end();++it2)
{
cout<<*it2<<" ";
}
cout<<endl;
vector<int> number={1,5,7,9,20};
for(auto &elem:number)
{
cout<<elem<<" ";
}
cout<<endl;
T c;
T d(a);//copy
T e = a; //copy
//***************
T f(std::move(a)); //move
//***************
auto iterB = b.begin();
auto iterE = b.end();
T g(iterB,iterE); //copy
a) std::forward_list 不提供size(),对空间上的极致效率
b) b.empty(); //return b.size() == 0
c) b.max_size(); 返回container能提供的最大数量
d)if(b ==c){
//比较数量OK
//通过迭代器顺序比较两个容器的值
}
e) 互换方式:
e=b
e=std::move(b)
e.swap(g); //swap很高效,但是除了array ,O(1)
swap(e,g) //O(1),除了std::array
f) e.cbegin ; //const_iterator const的迭代器
auto ea = e.cbegin() ;
auto eea = e.begin();
*eea; //不一定是const引用,得看eea
*ea; / /永远是const的引用
h) e.clear(); //清空容器里面的所有元素,是清空操作,std::array没有这个函数
g) unordered_set 和 unordered_map不支持<号,因为是无序的,靠哈希表的
i) list不提供下标运算符访问
std::array<int,100> a; //定义array为a
std::array<int,100> b ={}; //初始化b
c.at(pos);在复制、拷贝、交换后会可能越界发生错误
2.array的交换swap真的是值交换,其他container只是指针交换