STL序列式容器
1、STL容器
容器就是一些模板类的集合,但和普通模板类不同,容器中封装的是组织数据的方法(也就是数据结构)
2、迭代器
遍历容器中存储的元素多数情况会选用“迭代器”来实现
2.2迭代器的定义方式
尽管不同容器对应着不同类别的迭代器,这些迭代器有着较为统一的定义方式

以vector为例,遍历vector容器有以下几种方法:
int main()
{
vector<int>v{ 1,2,3,4,5,6,7,8 };
//第一种遍历方法
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << endl;//与普通数组一样,使用[]遍历
}
//第二种遍历方法
vector<int>::iterator i;
for (i = v.begin(); i != v.end(); i++)//用!=比较两个迭代器
{
cout << *i << endl;
}
//第三种遍历方法
for (i = v.begin(); i < v.end(); i++)//用<比较两个迭代器
{
cout << < *i << endl;
}
//第四种遍历方法
i = v.begin();
while (i < v.end())
{
cout << *i << endl;
}
不同容器指定使用不同的迭代器类型
| 容器 | 对应迭代器类型 |
| arrary |
随机访问迭代器 |
| vector | 随机访问迭代器 |
| deque | 随机访问迭代器 |
| list | 双向迭代器 |
| set / multiset | 双向迭代器 |
| map / multimap | 双向迭代器 |
| forward_list | 前向迭代器 |
| unorder_map | 前向迭代器 |
| unorder_set | 前向迭代器 |
| stack | 不支持迭代器 |
| queue | 不支持迭代器 |
再如List容器的迭代器式双向迭代器
list<int> v;
list<int>::const_itertator i;
//合法
for(i=v.begin();i!=v.end();i++)
cout<<*i;
//不合法,双向迭代器不能用<进行比较
for(i=v.begin();i<e.end();i++)
cout<<*i;
//不合法,双向迭代器不支持用下标随机访问元素
for(int i=0;i<v.size();i++)
cout<<v[i];
容器的迭代器的功能强弱分为一下迭代器类型:
| 迭代器 | 功能 |
| 前向迭代器 p | 支持++p、p++、*p,还可以被复制或者赋值,可以用==和!=进行比较,两个正向迭代器可以互相赋值 |
| 双向迭代器 p | 具有正向迭代器的全部功能,可以进行--p或者p--操作 |
| 随机访问迭代器 | 具有双向迭代器的全部功能。可以用 < 、>、>=、<=运算符进行比较 |
3、 序列式迭代器
3.1 Array容器
array容器以类模板的形式定义在<array>头文件,并位于命名空间std中
array<T,N>,T-用于指明容器中的存储的具体数据类型,N-用于指明容器的大小
创建具有是个double类型元素的array容器:
std::array<double,10 >values;
创建好是个浮点型元素,但是未显式指定这10个元素的值,各个元素的值是不确定的,(array容器不会做默认初始化操作)
std::array<aouble,10>values { };
这样的话容器中所有元素都会被初始化为0
3.1.1array容器访问元素
可以通过 容器名[]的方式直接访问和使用容器中的元素
values[4]=values[3]
此语句中,第5个元素的值被赋值为右边表达式的值,但是没有做任何边界检查,所以即便使用越界的索引值去访问或存储元素,也不会被检测到。
补充:array在重载[]运算符时,为什么没有实现边界检查功能?
答:因为性能不同。如果每次访问元素都去检查索引值,会产生很多开销,当不存在越界访问的可能时就避免这种开销。
可以使用array容器提供的at()成员函数
values.at(4)=values.at(3)
3.1.2 get<n>
除此之外,array容器也提供了get<n>模板函数,它是一个辅助函数,能够获取到容器的第n个元素
int main()
{
array<string,5>words{"one","two","three"};
cout<<get<2>(words)<<endl;
return 0;
}
3.1.3 data()
array容器也提供了data()成员函数,通过调用该函数可以得到指向容器首个元素的指针,通过该指针可以获得容器中的各个元素
int main()
{
array<int ,5>words{1,2,3,4,5};
cout<<*(words.data()+1);
return 0;
}
3.1.4 size()
array容器提供的size()函数能够返回容器中元素的个数,并计算它们的和
double total=0;
for(size_t i=0;i<values.size();i++)
{
totali+=values[i];
}
3.1.5 empty()
通过调用array容器的empty()成员函数,即可知道容器中有没有元素
if(values.empty())
std::cout<<"the container has no elements.";
else
std::cout<<"the container has"<<values.size()<<"elements";
很少会创建空的array容器,因为当生成一个array容器时,它的元素个数就固定了,所以生成空array容器的唯一办法就是将模板的第二个参数指定为0,但是这种情况基本不会发生。
更多推荐


所有评论(0)