c++ 容器排序,在C++中,容器是一种
第9章顺序容器顺序容器为开发者提供了控制元素存储和访问顺序的能力,顺序不依赖元素的值,而是元素加入元素容器时的位置相对应
顺序容器概述
如列表、转发列表是链式存储结构,而向量、队列、数组、字符串为顺序存储结构,在增删改等操作上它们会有不同的特性
构造函数容器是C对数据结构的一种封装,器本质是面向对象的设计,掌握相关的构造是一件理所当然的事情
默认构造默认构造相关的空容器
//示例1.cpp
list int m _ list//默认构造函数构造空容器
向量整数m _向量拷贝构造将m _向量拷贝一份到m _向量_副本
//示例1.cpp
vector int m _ vector _ copy(m _ vector);迭代器范围构造其范围是[开始,结束]范围内的元素
//示例1.cpp
向量int m _ vector _ 1(m _ vector _ copy。begin(),m _ vector _ copy。end());列表初始化构造//示例1.cpp
list int m_list_1{1,2,3 };
对于(自动项目:m_list_1){
标准输出项目endl//1 2 3
}迭代器迭代器的范围是[开始,结束],当容器为空时开始等于目标
//示例2.cpp
list int m_list{1,2,3 };
迭代器ITER=m _ list。begin();
while(iter!=m_list.end()){
cout * iter endl//1 2 3
国际热核聚变实验堆
}容器类型成员每个容器都定义了多个类型,如size_type、iterator、const_iterator
size _ type//示例3.cpp
list int m_list{1,2,3 };
list int:size _ type size=m _ list。size();
cout大小endl//3重复//示例3.cpp
迭代器ITER=m _ list。begin();const_iterator//example3.cpp
list int:const _ iterator const _ ITER=m _ list。begin();
//*常数_ ITER=1;//错误只读引用元素引用类型
//示例3.cpp
list int:reference m _ list _ reference=*(m _ list。begin());//int m _ list _ reference;
m _ list _ ref=999
cout *(m _ list。begin())endl;//999const_referenceconst引用
//示例3.cpp
list int:const _ reference m _ const _ list _ reference=*(m _ list。begin());//const int m _ const _ list _ ref
//m _ const _ list _ reference=888;
//错误:只读
for(vector int:const _ reference item:m _ list){//迭代器为循环
标准输出项目endl//1 2 3
}value_type容器存储类型的值类型
//示例3.cpp
list int:value _ type num=9;//int numpointer容器存储类型的指针类型
//示例3.cpp
list int:pointer ptr;//int *ptrconst_pointer容器存储类型常数指针类型
//示例3.cpp
list int:const _ pointer const _ ptr;//const int * const _ ptr difference _ type迭代器之间的距离
//示例3.cpp
向量int vec={1,2,3 };
vector int:difference _ type distance=end(vec)-begin(vec);
标准输出距离endl//3开始和目标成员我们以前接触到的开始和结束,分别指向第一个元素与最后一个元素的下一个位置,开始和目标有多个版本
r开头的返回反向迭代器,c开头的返回常数迭代器
反向迭代器与分裂与rbegin//example4.cpp
向量int vec={1,2,3,4 };
向量int:反向迭代器ITER=vec。Rb egin();
while(iter!=vec.rend()){
cout * iter endl//4 3 2 1
国际热核聚变实验堆
}cbegin和cend//示例4.cpp
向量int:const _ iterator const _ ITER=vec。c begin();
//* const _ ITER=999;crbegin和克伦德甚至还有这样的组合,真实离了个大谱了
//示例4.cpp
向量int:const _ reverse _ iterator const _ reverse _ ITER=vec。Cr begin();
while (const_reverse_iter!=vec.crend())
{
cout * const _ reverse _ ITER endl//4 3 2 1
常量_反向_ iter
}容器定义和初始化主要要掌握容器的构造函数的相关重载,以及赋值拷贝等特性
在前面的构造函数内容中我们已经过实践,可以进行复习与在此学习
存储不同类型元素的容器的转换是没有这样的转换的,如将向量整数转换为向量浮点,C中并没有相关的直接操作,但是允许我们使用迭代器范围方式初始化,迭代器相关元素类型必须有相关的构造函数
//示例5.cpp
#包括
#包括
使用命名空间标准
int main(int argc,char**argv){
向量int vec1{1,2,3 };
//向量ve C2(ve C1);//没有相关构造函数
向量浮点vec2(vec1.begin()、ve C1 . end());//可以用迭代器初始化
int num=float(* ve C1 . begin());//元素类型的构造函数可以用在后面
cout num endl//1
//字符串和字符*
const char * str1= hello
const char * str2= world
vector const char * str_vec={str1,str2}
向量字符串string_vec(str_vec.begin()、str _ vec . end());//可以用迭代器初始化
string str(* str _ vec . begin());//元素类型的构造函数可以用在后面
cout str endl//你好
返回0;
}标准库arrayarray大小固定。
除了C风格的数组,C还提供了一个数组类型,它也是一个顺序容器。
//示例6.cpp
#包括
#包括
使用命名空间std
int main(int argc,char**argv){
//一维数组
array int,10m _ array;
m _ array[0]=1;
cout m _ array[0]endl;
//二维数组
array数组int,10,10矩阵;
矩阵[0][0]=1;
cout matrix[0][0]endl;//1
//同样的,也可以有容器的特性。
数组array int,10,10:size _ type size=matrix . size();//size_type
数组array int,10,10 copy=matrix//复制构造
array array int,10,10:iterator ITER=matrix . begin();//迭代器等。
cout(* ITER)[0]endl;//1
返回0;
}分配和交换
//示例7.cpp
vector int vec1={1,2,3 };
向量int vec2={3,2,1 };
//c1=c2
vec2=vec1//复制
print_vec(vec1, ve C1 );//vec1:1 2 3
print_vec(vec2, ve C2 );//vec2:1 2 3
//c={a,b,c.}通过列表赋值
vec1={4,5,6,7 };
print_vec(vec1, ve C1 );//vec1:4 5 6 7
//swap(c1,c2)交换两个容器的内容。
swap(vec1,ve C2);
print_vec(vec1, ve C1 );//vec1:1 2 3
print_vec(vec2, ve C2 );//vec2:4 5 6 7
//赋值操作不适用于关联容器和数组。
vec1.assign({8,9,10 });//列表赋值
vec1.assign(vec2.begin()、ve C2 . end());//迭代器赋值
vec1.assign(10,999);//赋给10个999容器大小的操作容器有成员函数size,其返回类型为对应容器的size_type,成员函数为空。
//示例8.cpp
vector int vec1 {1,2,3 };
字符串str1= 123
vector int:size _ type ve C1 _ size=ve C1 . size();
string:size _ type str 1 _ size=str 1 . size();
cout vec1 _ size vec1 _ size endl//vec1_size 3
cout str1 _ size str1 _ size endl//str1_size 3
cout str 1 . empty()endl;//0
cout ve C1 . empty()endl;//0容器和关系运算符容器也可以使用,==关系运算符进行比较。
运算规则类似于字符串的关系运算。
1.如果两个容器大小相同,且所有元素成对相等,则两个容器相等;否则,两个容器不相等。
2.如果两个容器大小不同,但较小容器中的每个元素都等于较大容器中的相应元素,则较小容器小于较大容器。
3.如果两个容器都不是另一个容器的前缀子序列,则它们的比较结果取决于第一个不相等元素的比较结果。
//示例9.cpp
int arr1[10]{1,2,3,4,5 };
int arr2[10]{1,2,3,4,5 };
cout(arr 1==arr 2)endl;//0
//为什么头地址本质上是比较的?如果你忘了,你得复习数组一章。
//==
array int,5 array1{1,2,3,4,5 };
array int,5 array2{1,2,3,4,5 };
cout(array 1==array 2)endl;//1
vector int vec1={1,1,2,3 };
向量int vec2={
1,
1,
3,
一个
};
cout(ve C1==ve C2)endl;//0
cout(ve C1=ve C2)endl;//1
cout(ve C1 ve C2)endl;//0
容器的关系运算符依赖于元素的关系运算符。只有当容器的元素支持关系操作时,容器才能作为一个整体执行关系操作。
,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。