目录
前言(Foreword):
向量(Vector):
1.何为向量?
2.如何初始化Vector向量?
3.向量的基本 *** 作:
4.Range-based For Statement:
5.向量的插入 *** 作:
6.向量的排序 *** 作:
7.向量的删除 *** 作:
推荐阅读:
迭代器(Iterator)
如何定义迭代器?
使用迭代器进行遍历:
数组(Array)
数组的初始化(The Initialization of Array):
如何访问数组内的元素?
多维数组(Multidimensional Arrays):
后记(Postscript)
Express my thanks to DX.Xing
前言(Foreword):
最近学习C++的类和对象,发现了前面学习的薄弱项,那就是向量,迭代器和数组。
本篇文章主要介绍以上三个内容的基本知识,提供了通俗易懂的样例。
才疏学浅,难免有不足之处,请不吝赐教:
huel_weihaoran@163.com
battledroidwill@gmail.com
向量(Vector): 1.何为向量?Vector可以被理解为能够储存特定类型的动态数组,其大小可以压缩和增加。
使用前,需添加头文件:
#include
2.如何初始化Vector向量?
空向量:
vector a;//a是一个int类型的空vector;
向量副本:
//Express my thanks to DX.Xing
vector a1(a);
vector a1 = a;//a1是a的副本;
向量的列表初始化:
//Express my thanks to DX.Xing
vector a2(10,5);//a2有10个元素,值为5;
vector a3{10,5};//a3有2个元素,10和5;
vector a4(10);//a4有10个空元素;
vector s(10,"Hello!");//有10个元素,逗号右侧为元素值;
vector a5{1,2,3,4,5,6,7,8,9,10};
vector s1{"Hello","This","is","C++","World"};//列表初始化;
3.向量的基本 *** 作:
1.关于向量间的比较:
若两vector的容量不同,但相同位置上的元素相同,则元素较少的vector<元素较多的vector;
若元素的值不同,则两vector之间的大小关系由第一对不同的元素值的大小关系所决定。
2.push_back() *** 作:
在Vector类的末尾压入与Vector类的类型相匹配的元素;
#include
#include
#include
//屈平辞赋悬日月,楚王台榭空山丘;
using namespace std;
int main(){
vector v1;
vector v2;
int num;
cout<<"Please enter the numbers to v1;"<>num) v1.push_back(num);
cout<<"Please enter the numbers to v1;"<>num) v2.push_back(num);
cout<<"The size of v1 & v2 are "<v2) cout<<"v2 is smaller than v1;"< v3{0,1,2,3,4,5,6,7,8,9};
for(auto i: v3) cout<
4.Range-based For Statement:
使用范围For语句可以构造必须循环全部内容的循环。
auto关键字:
auto是一个类型说明符,在创建时必须初始化;
auto关键字可以推断表达式所返回的类型;
Attention:C的auto和C++的auto作用不一致;
举个栗子:
//using 'Range For' to visit vector's elements;
vector v3{0,1,2,3,4,5,6,7,8,9};
for(auto i: v3) cout<
注:auto &i 可以对v3内的元素进行 *** 作,然而,auto i只能读取v3中的元素;
5.向量的插入 *** 作:上文我们初识了push_back *** 作,然而,push_back *** 作一般用于循环(具有一定规律)等 *** 作中,缺乏灵活性。 然而,vector本身也可以通过下标访问,因此,我们可以使用insert *** 作;
介绍三种常用的插入 *** 作:
初始化:
vector v1{1,2,3};
vector v2(v1),v3(v1),v4(v1);
//创建3个v1的副本
Method1:v1内初始元素为1,2,3;结果为3 3 3 1 2 3;
//Method1:insert(position,num,value);
//向Position前插入num个值为value的元素;
v1.insert(v1.begin(),3,3);
for(auto i : v1){
cout<
Method2:v2内初始元素为1,2,3;结果为3 1 2 3;
//Method2:insert(position,value);
//向Position前插入值为value的元素;
v2.insert(v2.begin(),3);
for(auto i : v2){
cout<
Method3:v3内初始元素为1,2,3;结果为4 5 6 1 2 3;
//Method3:insert(position,list);
在position之前,插入初始化列表list;
v3.insert(v3.begin(),{4,5,6});
for(auto i: v3){
cout<
6.向量的排序 *** 作:
Sort排序:注意头文件:
注意:sort(vector.begin(),vector.end())的结果是升序排列;
如果想得到降序排列,需要使用reverse(vector.begin(),vector.end());
#include
#include
#include//使用sort函数的必要条件;
using namespace std;
int main(){
vector v;
int i;
while(cin>>i) v.push_back(i);
sort(v.begin(),v.end());//默认升序Sort;
for(auto i: v) cout<
7.向量的删除 *** 作:
pop_back():可以压缩Vector的大小,单次可d出Vector末尾的一个元素;
举个栗子:
#include
#include
using namespace std;
//v.pop_back()d出v中最后一个元素;
int main(){
vector v1{0,1,2,3,4,5,6,7,8,9};
vector v2(v1);
for(auto &i: v1) v1.pop_back();
if(v1.empty()) cout<<"Now,v1's element is empty."<
v1.empty():如果v1是空向量,返回值为1,否则为0;
v2.clear()清空v2内的元素;
Method1:erase(position)删除position位置的元素;
#include
#include
using namespace std;
int main()
{
vector v1 = {1, 2, 3, 4, 5, 6},v2(v1);
v1.erase(v1.begin());//删除第1个位置的元素;
v2.erase(v2.begin()+1);//删除第2个位置的元素;
for(int i = 0;i < v1.size();i++) cout<
Method2:erase(begin,end):删除向量中序号为[begin,end)中元素;
#include
#include
using namespace std;
int main()
{
vector v1 = {1, 2, 3, 4, 5, 6};
v1.erase(v1.begin(),v1.begin()+2);//删除第1个和第2个位置的元素;
for(auto i : v1) cout<
注意:v1.begin()返回的类型为指针,并非int;不能通过下标进行直接访问;
当然,上文介绍的Vector *** 作,仅仅是冰山一角;
推荐阅读:1.C++ Primer中文版:第5版 作者:李普曼(Lippman,S.B.),拉乔伊(Lajoie,J.),(美)默(Moo,B.E.)译者:王刚,杨巨峰 出版社:电子工业出版社;
https://www.runoob.com/w3cnote/cpp-vector-container-analysis.htmlhttps://docs.microsoft.com/en-us/cpp/cpp/range-based-for-statement-cpp?view=msvc-170
迭代器(Iterator)迭代器:可以顺序或者逆序访问容器内的元素,形如“指针”;
假定it为迭代器,*it即可对迭代器所指向容器的元素进行访问;
如何定义迭代器?1.容器类型名::iterator 迭代器名称
2.容器类型名::const_iterator 迭代器名称
3.容器类型名::reverse_iterator 迭代器名称
4.容器类型名::const_reverse_iterator 迭代器名称
两种正向迭代器:(以String类为例)
正向++:Iterator会指向下一个元素;
类型名
string str("Hello,C++ World");
string::iterator it;//读写string中的元素;
string::const_iterator it2;//只可读,不能写;
两种反向迭代器:(以String类为例)
反向++:Iterator会指向上一个元素;
string str("Hello,C++ World");
string::reverse_iterator it;//读写string中的元素;
string::const_reverse_iterator it2;//只可读,不能写;
使用迭代器进行遍历:
正向遍历:
for(it = str.begin(); it != str.end() && !isspace(*it); ++it){
* it = toupper(*it);
}
负向遍历:
for(it2 = str.rbegin(); it2 != str.rend() && !isspace(*it2); ++it2){
* it2 = toupper(*it2);
}
Attention:1.正向为 begin和 end;负向为 rbegin 和 rend;
2.选择++it 而非 it++,++it在次数较多的循环内更能节省时间;
举个栗子:
1.将“Hello,C++ World”变为大写,第一行顺序输出每个字母,第二行输出整个字符串;
注意:对"it"解引用可以写成"! it->issapce"
#include
using namespace std;
int main(){
string str("Hello,C++ World");
string::iterator it;//读写string中的元素;
string::const_iterator it2;//只可读,不能写;
for(it = str.begin(); it != str.end() && !isspace(*it); ++it){
* it = toupper(*it);
}
for(it = str.begin(); it != str.end() && !isspace(*it); ++it){
cout<<*it<<" ";
}//H E L L O , C + +
cout<
2.打印图案,如图所示:
源码如下:
对迭代器的遍历可以在For循环内进行同时可以使用auto关键字;
当然可以使用:vector
#include
#include
//Express my thanks to DX.Xing
using namespace std;
int main(){
string star(7,'*');//定义一个含有7个'*'的字符串;
vector v1;//创建string类型的vector容器v1;
cout<empty(); ++it) cout<<*it<
数组(Array)
数组(Array)和向量(Vector)类似,都是存放某种类型的容器(Container);
数组的大小不变,在某种情况下,虽然失去了一定的灵活性,但提高了程序运行的性能;
数组的初始化(The Initialization of Array):模板如下:
#include
//Express my thanks to DX.Xing
using namespace std;
const int N =1e5 + 10;
int arr0[N];//全局变量,arr0数组内的值均为0;
int main(){
int arr[10] = {0};//定义了名为arr的int类型的数组,长度为10,并且值均为0;
int arr1[] = {0,1,3};//[]内为空,但此时数组的大小是3;
//通过sizeof(数组名)/sizeof(数组中的某一元素)来得到数组的长度
//sizeof(数组)得到的是数组整体的长度;
//sizeof(数组的某一元素)得到的是数组的单个元素的长度;
cout<<"The size of arr is "<'};//含空字符,长度为4;
cout<<"The size of ch2 is "<';
//使用Range For语句确定ch3的元素个数;
for(auto i: ch3){
cout<
数组遵循默认初始化:若Build-in-Type变量没有被显式(Explicit)初始化,其值由定义的位置所决定。
全局变量(Global Variable)被初始化为0。
如何访问数组内的元素?
Merhod 1:Using Range-Based For Statement;
范围For语句遍历数组:
举个栗子:
#include<
#include
//Express my thanks to DX.Xing
using namespace std;
int main(){
char ch[14] = "Hello,DX.Xing";
//Attention:The size of ch are 14;
cout
Merhod 2:Using Subscript Operation;
举个栗子:
#include<';i++){
if(islower(ch[i])) ch[i] -= 32;
cout<
#include
//Express my thanks to DX.Xing
using namespace std;
int main(){
char ch[14] = "Hello,DX.Xing";
//Attention:The size of ch are 14;
cout
Attention:使用下标访问时,注意边界问题,防止数组越界;
多维数组(Multidimensional Arrays):
多维数组,本质上仍然是一维数组,只不过数组内的元素仍然是数组;
以二维数组为例:
//Express my thanks to DX.Xing
int arr0[3][4] = {0}
int arr1[3][4] = {
{0,1,2,3},
{4,5,6,7},
{8,9,0,0}
};
int arr2[3][4] = {0,1,2,3,4,5,6,7,8,9,0,0}
我们可以把arr0,arr1和arr2数组想象成一个包含3个元素的数组,每个元素又作为一个数组包含了4个元素;故,把前3个元素称为3行,每个元素数组包含的4个元素称为4列。
int arr3[3][4] = {
{0},
{4},
{8}
};
访问二维数组亦可用范围For语句以及下标访问法,当然也可以使用指针访问;
<
#include
using namespace std;
//Express my thanks to DX.Xing
int main(){
int arr[3][4] = {0,1,2,3,4,5,6,7,8,9,0,0};
//using Range-Based For Statement
for(auto &i1 : arr){//对外层元素引用
for(auto &i2 : i1){//对内层元素引用
cout
后记(Postscript)
激励我写博客的原因有很多,背后有许多支持我的朋友,他们给我提供了难得的实验环境,给了我许多启发。
学习编程语言,感悟背后的算法思想,需要持久不变的初心,那就是互相奉献心态和共享知识的精神。
Express my thanks to DX.Xing
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)