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,但是这种情况基本不会发生。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐