笔记:C++学习之旅 ---string 类、vector和迭代器
string 类
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1,s2;
cin>>s1>>s2;
cout<<s1<<s2<<endl;
return 0
}
如果相对string对象中的每个字符做点儿 什么操作,目前最好的办法是使用C++11新提供的一种语句:范围for(range for)语句。这种语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是:
for (declaration :expression)
statement
#include <iostream>
#include <string>
using namespace std;
int main()
{
//string s1,s2;
//cin>>s1>>s2;
//cout<<s1<<s2<<endl;
string str( "some string");
for( auto c:str)
cout<<c<<endl;
return 0;
}
使用基于for语句处理每个字符是一个好的方式,要想访问string对象中的字符有两种方式:一种是使用下标,另外一种是使用迭代器;
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s("some string");
if(!s.empty()) //确保确实有字符需要输出;
s[0] = toupper(s[0]); //将字符“some string”中第一个字符s改成大写;
cout<<s[0]<<endl<<s<<endl; //输出大写S,以及改完以后的字符串“Some string”;
return 0;
}
标准库类型vector
标准库类型vector表示对象的集合,其中所有的对象的结合都相同;
以vector 为例,提供额外的是vector内所存放对象的类型;
vector <int> ivec; //ivec 保存int类型的对象;
vector<Sales_item> Sales_vec;//保存Sale_item类型的对象;
vector<vector<string>> file;//该向量的元素vector对象;
vector初始化
可以用vector对象容纳的元素数量和所有元素的同意的初始值来初始化vector对象:
vector<int> ivec(10,-1)//10个int类型的元素,每个都被初始化为-1;
vector<string> svec(10,"hi !");//10个string类型的元素,每个都被初始化为"hi!";
vector<int> ivec(10);//10个元素,每个都被初始化为0;
vector<string> svec(10);//10个元素,每个都是空string对象;
vector<int> v1{10};//v1有一个元素,这个元素的值是10;
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<int> ivec;
int i;
cout<< "请输入数字(输入-1退出)\n" ;
while(1)
{
cin>>i;
if(i == -1)
break;
ivec.push_back(i);
}
if(ivec.empty())
{
cout<< "this vector is empty "<<endl;
return -1;
}
else if (ivec.size() == 1)
{
cout<< "没有相邻的元素" <<endl;
return -2;
}
else
{
for( decltype(ivec.size()) i = 0;i != ivec.size()-1;++i)
cout<< "相邻两个整数的和:" <<ivec[i] + ivec[i+1]<<endl;
}
int x = 0;
int y = ivec.size()-1;
while(1)
{
if(x > y)
break;
cout<<ivec[x]+ivec[y]<<endl;
x++;
y--;
}
return 0;
}
迭代器(iterator)
迭代器类型
1)类似于指针,迭代器也提供了对对象的间接访问,和指针不一样的是,或缺迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。
auto b = v.begin(),e = v.end(); //由编译器决定b和e的类型,b表示v的第一个元素,e表示v尾元素的下一位置
2)就想不知道string和vector的size_type成员,到底是什么类型一样,一般来说我们也不知道(其实也无需知道)迭代器的精确类型,而实际上那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型:
vector<int> ::iterator it;//it 能读写vector<int>的元素;
string::iterator it2;//it2能读写string对象中的字符;
vector<int>::const_iterator it3;//it3只能读元素,不能写元素;
string::const_iterator it4;//it4只能读字符,不能写字符
结合解引用和成员访问操作
解引用迭代器获得迭代器所指的对象,如果该对象的类型恰好是类,就有可能希望进一步访问它的成员。例如,对一个由字符串组成的vector对象来说,要想检查元素是否为空,令it是该vector对象的迭代器,只需检查it所指字符串是否为空就可以,代码如下:
(*it).empty();//解引用it,然后调用结果对象的empty成员;
*it.empty();//错误:试图访问it的名为empty的成员,但it是个迭代器,没有empty成员;
范围for语句
如果想对string对象中的每个字符做点儿什么操作,目前最好的办法就是使用C++11新标准提供的一种语句:范围for语句。
举个稍微复杂点的例子,使用范围for语句和ispunct函数来统计string对象中标点符号的个数:
string s("Hello World!!!");
//punct_cnt的类型和s.size的返回类型一样;
decltype(s.size()) punct_cnt = 0;
for(auto c : s)
if(ispunct(c))
++punct_cnt;
cout<<punct_cnt<<" punctuation characters in "<<s<<endl;
输出结果为:3 punctuation characters in Hello World!!!
string 类
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1,s2;
cin>>s1>>s2;
cout<<s1<<s2<<endl;
return 0
}
如果相对string对象中的每个字符做点儿 什么操作,目前最好的办法是使用C++11新提供的一种语句:范围for(range for)语句。这种语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是:
for (declaration :expression)
statement
#include <iostream>
#include <string>
using namespace std;
int main()
{
//string s1,s2;
//cin>>s1>>s2;
//cout<<s1<<s2<<endl;
string str( "some string");
for( auto c:str)
cout<<c<<endl;
return 0;
}
使用基于for语句处理每个字符是一个好的方式,要想访问string对象中的字符有两种方式:一种是使用下标,另外一种是使用迭代器;
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s("some string");
if(!s.empty()) //确保确实有字符需要输出;
s[0] = toupper(s[0]); //将字符“some string”中第一个字符s改成大写;
cout<<s[0]<<endl<<s<<endl; //输出大写S,以及改完以后的字符串“Some string”;
return 0;
}
标准库类型vector
标准库类型vector表示对象的集合,其中所有的对象的结合都相同;
以vector 为例,提供额外的是vector内所存放对象的类型;
vector <int> ivec; //ivec 保存int类型的对象;
vector<Sales_item> Sales_vec;//保存Sale_item类型的对象;
vector<vector<string>> file;//该向量的元素vector对象;
vector初始化
可以用vector对象容纳的元素数量和所有元素的同意的初始值来初始化vector对象:
vector<int> ivec(10,-1)//10个int类型的元素,每个都被初始化为-1;
vector<string> svec(10,"hi !");//10个string类型的元素,每个都被初始化为"hi!";
vector<int> ivec(10);//10个元素,每个都被初始化为0;
vector<string> svec(10);//10个元素,每个都是空string对象;
vector<int> v1{10};//v1有一个元素,这个元素的值是10;
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<int> ivec;
int i;
cout<< "请输入数字(输入-1退出)\n" ;
while(1)
{
cin>>i;
if(i == -1)
break;
ivec.push_back(i);
}
if(ivec.empty())
{
cout<< "this vector is empty "<<endl;
return -1;
}
else if (ivec.size() == 1)
{
cout<< "没有相邻的元素" <<endl;
return -2;
}
else
{
for( decltype(ivec.size()) i = 0;i != ivec.size()-1;++i)
cout<< "相邻两个整数的和:" <<ivec[i] + ivec[i+1]<<endl;
}
int x = 0;
int y = ivec.size()-1;
while(1)
{
if(x > y)
break;
cout<<ivec[x]+ivec[y]<<endl;
x++;
y--;
}
return 0;
}
迭代器(iterator)
迭代器类型
1)类似于指针,迭代器也提供了对对象的间接访问,和指针不一样的是,或缺迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。
auto b = v.begin(),e = v.end(); //由编译器决定b和e的类型,b表示v的第一个元素,e表示v尾元素的下一位置
2)就想不知道string和vector的size_type成员,到底是什么类型一样,一般来说我们也不知道(其实也无需知道)迭代器的精确类型,而实际上那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型:
vector<int> ::iterator it;//it 能读写vector<int>的元素;
string::iterator it2;//it2能读写string对象中的字符;
vector<int>::const_iterator it3;//it3只能读元素,不能写元素;
string::const_iterator it4;//it4只能读字符,不能写字符
结合解引用和成员访问操作
解引用迭代器获得迭代器所指的对象,如果该对象的类型恰好是类,就有可能希望进一步访问它的成员。例如,对一个由字符串组成的vector对象来说,要想检查元素是否为空,令it是该vector对象的迭代器,只需检查it所指字符串是否为空就可以,代码如下:
(*it).empty();//解引用it,然后调用结果对象的empty成员;
*it.empty();//错误:试图访问it的名为empty的成员,但it是个迭代器,没有empty成员;
范围for语句
如果想对string对象中的每个字符做点儿什么操作,目前最好的办法就是使用C++11新标准提供的一种语句:范围for语句。
举个稍微复杂点的例子,使用范围for语句和ispunct函数来统计string对象中标点符号的个数:
string s("Hello World!!!");
//punct_cnt的类型和s.size的返回类型一样;
decltype(s.size()) punct_cnt = 0;
for(auto c : s)
if(ispunct(c))
++punct_cnt;
cout<<punct_cnt<<" punctuation characters in "<<s<<endl;
输出结果为:3 punctuation characters in Hello World!!!