Error[8]: Undefined offset: 409, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 114
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

前言(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++的类和对象,发现了前面学习的薄弱项,那就是向量,迭代器和数组。


本篇文章主要介绍以上三个内容的基本知识,提供了通俗易懂的样例。


才疏学浅,难免有不足之处,请不吝赐教:

[+++]

[+++]

向量(Vector): [+++]

Vector可以被理解为能够储存特定类型的动态数组,其大小可以压缩和增加。


使用前,需添加头文件:

#include
[+++]

空向量:

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"};//列表初始化;
[+++]

[+++]

[+++]

若元素的值不同,则两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<
[+++]

使用范围For语句可以构造必须循环全部内容的循环。


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中的元素;

[+++]

上文我们初识了push_back *** 作,然而,push_back *** 作一般用于循环(具有一定规律)等 *** 作中,缺乏灵活性。


然而,vector本身也可以通过下标访问,因此,我们可以使用insert *** 作;

介绍三种常用的插入 *** 作:

[+++]

    vector v1{1,2,3};
    vector v2(v1),v3(v1),v4(v1);
    //创建3个v1的副本

[+++]

[+++]

[+++]

[+++]

[+++]

[+++]
[+++]

[+++]

[+++]

[+++]

#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<
[+++]

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."<

[+++]

[+++]

[+++]

#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<

[+++]

#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.将“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.打印图案,如图所示:

 源码如下:

[+++]

当然可以使用:vector::reverse_iterator it;

#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);

数组的大小不变,在某种情况下,虽然失去了一定的灵活性,但提高了程序运行的性能;

[+++]

[+++]

#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< 

数组遵循默认初始化:若[+++]变量没有被显式(Explicit)初始化,其值由定义的位置所决定。


全局变量(Global Variable)被初始化为0。

[+++]

[+++]

[+++]

[+++] 
#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

[+++]

[+++] 
#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

Attention:使用下标访问时,注意边界问题,防止数组越界;

多维数组(Multidimensional Arrays):

[+++]
 
以二维数组为例:

[+++]


我们可以把arr0,arr1和arr2数组想象成一个包含3个元素的数组,每个元素又作为一个数组包含了4个元素;故,把前3个元素称为3行,每个元素数组包含的4个元素称为4列。

[+++]
 
访问二维数组亦可用范围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)
        激励我写博客的原因有很多,背后有许多支持我的朋友,他们给我提供了难得的实验环境,给了我许多启发。



学习编程语言,感悟背后的算法思想,需要持久不变的初心,那就是互相奉献心态和共享知识的精神。

<===> <===>[+++]<===>)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 410, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 114
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

前言(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++的类和对象,发现了前面学习的薄弱项,那就是向量,迭代器和数组。


本篇文章主要介绍以上三个内容的基本知识,提供了通俗易懂的样例。


才疏学浅,难免有不足之处,请不吝赐教:

[+++]

[+++]

向量(Vector): [+++]

Vector可以被理解为能够储存特定类型的动态数组,其大小可以压缩和增加。


使用前,需添加头文件:

#include
[+++]

空向量:

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"};//列表初始化;
[+++]

[+++]

[+++]

若元素的值不同,则两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<
[+++]

使用范围For语句可以构造必须循环全部内容的循环。


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中的元素;

[+++]

上文我们初识了push_back *** 作,然而,push_back *** 作一般用于循环(具有一定规律)等 *** 作中,缺乏灵活性。


然而,vector本身也可以通过下标访问,因此,我们可以使用insert *** 作;

介绍三种常用的插入 *** 作:

[+++]

    vector v1{1,2,3};
    vector v2(v1),v3(v1),v4(v1);
    //创建3个v1的副本

[+++]

[+++]

[+++]

[+++]

[+++]

[+++]
[+++]

[+++]

[+++]

[+++]

#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<
[+++]

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."<

[+++]

[+++]

[+++]

#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<

[+++]

#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.将“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.打印图案,如图所示:

 源码如下:

[+++]

当然可以使用:vector::reverse_iterator it;

#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);

数组的大小不变,在某种情况下,虽然失去了一定的灵活性,但提高了程序运行的性能;

[+++]

[+++]

#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< 

数组遵循默认初始化:若[+++]变量没有被显式(Explicit)初始化,其值由定义的位置所决定。


全局变量(Global Variable)被初始化为0。

[+++]

[+++]

[+++]

[+++] 
#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

[+++]

[+++] 
#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

Attention:使用下标访问时,注意边界问题,防止数组越界;

多维数组(Multidimensional Arrays):

[+++]
 
以二维数组为例:

[+++]


我们可以把arr0,arr1和arr2数组想象成一个包含3个元素的数组,每个元素又作为一个数组包含了4个元素;故,把前3个元素称为3行,每个元素数组包含的4个元素称为4列。

[+++]
 
访问二维数组亦可用范围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)
        激励我写博客的原因有很多,背后有许多支持我的朋友,他们给我提供了难得的实验环境,给了我许多启发。



学习编程语言,感悟背后的算法思想,需要持久不变的初心,那就是互相奉献心态和共享知识的精神。

<===>[+++]<===>)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 411, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 114
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

前言(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++的类和对象,发现了前面学习的薄弱项,那就是向量,迭代器和数组。


本篇文章主要介绍以上三个内容的基本知识,提供了通俗易懂的样例。


才疏学浅,难免有不足之处,请不吝赐教:

[+++]

[+++]

向量(Vector): [+++]

Vector可以被理解为能够储存特定类型的动态数组,其大小可以压缩和增加。


使用前,需添加头文件:

#include
[+++]

空向量:

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"};//列表初始化;
[+++]

[+++]

[+++]

若元素的值不同,则两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<
[+++]

使用范围For语句可以构造必须循环全部内容的循环。


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中的元素;

[+++]

上文我们初识了push_back *** 作,然而,push_back *** 作一般用于循环(具有一定规律)等 *** 作中,缺乏灵活性。


然而,vector本身也可以通过下标访问,因此,我们可以使用insert *** 作;

介绍三种常用的插入 *** 作:

[+++]

    vector v1{1,2,3};
    vector v2(v1),v3(v1),v4(v1);
    //创建3个v1的副本

[+++]

[+++]

[+++]

[+++]

[+++]

[+++]
[+++]

[+++]

[+++]

[+++]

#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<
[+++]

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."<

[+++]

[+++]

[+++]

#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<

[+++]

#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.将“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.打印图案,如图所示:

 源码如下:

[+++]

当然可以使用:vector::reverse_iterator it;

#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);

数组的大小不变,在某种情况下,虽然失去了一定的灵活性,但提高了程序运行的性能;

[+++]

[+++]

#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< 

数组遵循默认初始化:若[+++]变量没有被显式(Explicit)初始化,其值由定义的位置所决定。


全局变量(Global Variable)被初始化为0。

[+++]

[+++]

[+++]

[+++] 
#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

[+++]

[+++] 
#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

Attention:使用下标访问时,注意边界问题,防止数组越界;

多维数组(Multidimensional Arrays):

[+++]
 
以二维数组为例:

[+++]


我们可以把arr0,arr1和arr2数组想象成一个包含3个元素的数组,每个元素又作为一个数组包含了4个元素;故,把前3个元素称为3行,每个元素数组包含的4个元素称为4列。

[+++]
 
访问二维数组亦可用范围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)
        激励我写博客的原因有很多,背后有许多支持我的朋友,他们给我提供了难得的实验环境,给了我许多启发。



学习编程语言,感悟背后的算法思想,需要持久不变的初心,那就是互相奉献心态和共享知识的精神。

[+++]<===>)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
浅析向量(Vector),迭代器(Iterator)和数组_C_内存溢出

浅析向量(Vector),迭代器(Iterator)和数组

浅析向量(Vector),迭代器(Iterator)和数组,第1张

目录

前言(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::reverse_iterator it;

#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<
#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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/578082.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)