<C++ Primer >学习笔记 第三章 字符串向量和数组 (上)

第三章也分为两部分介绍,前半部分是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];
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值