第三章也分为两部分介绍,前半部分是using,string,vector。后半部分是迭代器,数组和多维数组。这一章不难理解,但是非常重要。
命名空间的using声明
有了using声明就无须专门的前缀也能使用所需的名字了。using声明具有如下的形式:
using namespace::name;
一旦声明了上述语句,就可以直接访问命名空间中的名字。一般using声明不用在头文件中,可能会出现名字冲突的问题。一般在程序里,我们都使用
using namespace std;
这样我们就不需要可以不用再重复写std::了。
标准库string
初始化string对象的方式
string s1 //默认初始化,s1是一个空串
string s2(s1) //s2是s1的副本
string s2=s1 //s2是s1的副本
string s3("value") //s3是字面值value的副本,直接初始化
string s3="value" //和上面意思相同,拷贝初始化
string s4(n,'c') //n个字符c组成的串,直接初始化
string对象上的操作
一个string对象的操作
string s;
cin>>s; //将string对象读入s,会自动忽略开头的空白和字符,遇到一个真正的字符开始读起,直到遇到下一个空白为止
cout<<s; //输出s
getline(cin,s);//读入一整行,遇到换行符停止
s.empty(); //根据对象s是否为空返回一个bool值
s.size(); //返回对象的长度,即string对象中字符的个数
len=s.size(); //len类型是string::size_type()
两个string对象的操作
比较string对象:
== != < <= > >=
1.如果两个string对象长度不同,并且每个存在的字符都相同,就说较短string对象小于较长string对象。
2.如果两个string对象某些对应位置上不一样,最后的结果是相异的第一对字符的比较结果
string s1="hello, ",s2="world"
string s3=s1+s2; //两个string对象相加
string s3=s1+","+s2+'/n';//string和字面值相加
注意:当把string变量和字面值加在一起时,‘+’的两侧必须有一个是string对象,两个字面值无法直接相加。
3.4 输入两个字符串,判断两个字符串是否相等,如果不相等输出较大的那一个
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1,s2;
cout<<"请输入两个字符串"<<endl;
cin>>s1>>s2;
if(s1==s2)
cout<<"字符串相等"<<endl;
else if (s1>s2)
cout<<s1<<endl;
else
cout<<s2<<endl;
}
处理string中的每个字符
范围for语句
for(declaration:expression)
statement
expression部分是一个对象,用于表示一个序列,declaration定义一个变量,该变量用于访问序列中的基础元素。每次迭代,declaration部分变量会被初始化为expresion的下一个元素值。
编写一段程序,使用范围for语句将字符串内所有字符用X代替
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
getline(cin,s);
for(auto &c:s) //c必须是引用类型,否则无法改变s
{
c='X';
}
cout<<s;
return 0;
}
上面的程序有两点需要注意的,一是利用auto关键字推断字符串中每个元素的类型,二是c必须定义为引用类型,否则无法修改字符串的内容,在上面这个程序中auto的类型其实是char型,用auto可以省略我们自己做判断的时间和规避掉一些错误,在这个例子中如果把auto改成char也是可以使用的。
使用这个例子再来说说范围for,这个范围for其实是相对于传统while和for来讨论的,如果上面这个例子我们用传统while来完成,条件将会变成while(s[i]!=’\0’),循环体部分也需要i++,如果使用传统for,就要写成for(unsigned int i =0;i<s.size;i++)。相对于范围for来说就过于麻烦,不够简洁。
有一个头文件cctype,可以让我们更简洁的去操作string中的某一个字符
include<cctype>
isalnum(c) c是字母或数字时为真
isalpha(c) c是字母时为真
iscntrl(c) c是控制字符为真
isdigit(c) c是数字时为真
isgraph(c) c是除空格之外的打印字符时为真
ispunct(c) c是标点符号时为真
isspace(c) c是标准空白字符,如空格、进纸、换行符、回车、水平制表符或者垂直制表符时为真
isupper(c) c是大写字母时为真
isxdigit(c) c是十六进制的数字时为真
tolower(c) c是大写字符,则返回其小写,否则返回该参数
toupper(c) c是小写字母,则返回其大写,否则返回该参数
补充几个:
islower() 如果参数是小写字母,该函数返回true
isprint() 如果参数是打印字符(包括空格),该函数返回true
isblank() 如果参数是空格或水平制表符,该函数返回true
标准库vector
vector表示对象的集合,其中所有对象都相同,集合里每个对象都有与之对应的索引,索引用于访问对象。
实例化:编译器根据模板创建类或函数的过程。
vector初始化对象的方式:
#include<vector>
vector<T> v1 v1是一个空的vector,潜在元素是T类型,执行默认初始化
vector<T> v2(v1) v2包含所有v1元素的副本
vector<T> v2=v1 等价于v2(v1)
vector<T> v3(n,val) v3中包含n个重复元素,每个元素都是val
vector<T> v4(n) v4中包含了n个被执行了初始化的对象
vector<T> v5{a,b,c...} v5包含了初始值个数个元素,每个元素都被初始化
vector<T> v5={a,b,c...} 与上面的相同
//v5也属于列表初始化,注意{}和()的区别,()是用来构造vector对象的,{}是用来列表初始化元素的
注:引用不是对象,所以没有引用的vector
向vector对象中添加元素
一般先创建一个空的vector,利用push_back向其添加元素,push_back负责把一个值当初vector的尾元素“压到(push)”到vector的“尾端(back)”
编写一个程序,用cin读入一组整数,并把他们存入一个vector对象
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> ivec;
int i;
char cont ='y';
while(cin>>i)
{
ivec.push_back(i);
cout << "Do you want to continue typing characters?(y/n)"<<endl;
cin >> cont;
if(cont!='y'&&cont!='Y')
break;
}
return 0;
}
vector的其他操作
v.empty() 如果v不含有任何元素返回真,否则返回假
v.size() 返回v中的元素个数
v.push_back(t) 像v的尾部添加一个值为t的元素
v[n] 返回v中第n个位置上元素的引用
v1=v2 用v2中的拷贝替换v1中的元素
v1={a,b,c...} 列表中元素的拷贝替换v1中的元素
v1==v2 v1和v2相等,当且仅当它们元素数量相等,并且对应位置上的元素值都相同
v1!=v2
<,<=,>,>=
注:下标可以去访问一个已存在对象的值而不能去添加对象的值,因为一个空的vector不存在下标
初始化一些vector并用范围for进行输出
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<int> v1;
vector<int> v2(10);
vector<int> v3(10,42);
vector<int> v4{10};
vector<int> v5{10, 42};
vector<string> v6{10};
vector<string> v7{10,"hi"};
for(auto &a:v1)
cout<<a;
for(auto &a:v2)
cout<<a;
for(auto &a:v3)
cout<<a;
for(auto &a:v4)
cout<<a;
for(auto &a:v5)
cout<<a;
for(auto &a:v6)
cout<<a;
for(auto &a:v7)
cout<<a;
}
练习3.17 从cin读入一组词并它们存入一个vector对象的容量和内容输出出来
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
vector<string> v;
string s;
char cont='y';
cout<<"please input one character:"<<endl;
while(cin>>s)
{
v.push_back(s);
cout<<"Do u wang to input other character?(y/n)";
cin>>cont;
if(cont!='y'&&cont!='Y')
break;
cout<<"please input one character"<<endl;
}
for(auto &men:v) //string &men:v
{
for(auto &i:men) //char &i:men
i=toupper(i);
cout<<men<<endl;
}
}
读入一组整数并把它们存入一个vector对象中,并将头尾相加并输出
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vInt;
cout<<"Please input charaters"<<endl;
int i;
while(cin>>i)
vInt.push_back(i);
if(vInt.size()==0)
{
cout<<"empty"<<endl;
return -1;
}
for(decltype(vInt.size()) i=0;i<vInt.size()/2;i++)
cout<<vInt[i]+vInt[vInt.size()-i-1]<<" ";
if(vInt.size()/2!=0) //如果是奇数 单独处理中间的数字
cout<<vInt[vInt.size()/2];
}