标准库类型(string,getline,vector)
string对象的初始化:
string s1; 默认构造函数,s1为空串;
string s2(s1); 将s2初始化为s1的一个副本
string s3("value"); 将s3初始化为一个字符串字面值副本
string s4(n,'c'); 将s4初始化为字符'c'的n个副本
</pre><pre name="code" class="cpp">
string 对象的读写:
(1)读取并忽略开头所有的空白字符(如空格,换行,制表符)。
(2)读取字符直至再次遇到空白字符,读取终止。
如:
int main()
{
string s1,s2;
cint >> s2 >> s2;
cout << s1 <<s2 <<end;
}
如果输入到程序的是" hello world !",则屏幕上输出"helloworld".
string 对象的操作:
s.empty() 如果s为空串,则返回true,否则返回false
s.size() 返回s中字符的个数
s[n] 返回s位置为n的字符,位置从0开始计数
s1 + s2 把s1和s2连接成一个新字符串,返回新生成的字符串
s1 = s2 把s1内容替换为s2的副本
v1 == v2 比较v1与v2的内容,相等则返回true,否则返回false
当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的:
string s=s1+"," ok
string s = s1 + ",", + "world"; ok
string s = "hello" + ","; error
string 对象中字符的处理:
isalnum(c) 如果c是字母或数字,则为true
isalpha(c) 如果c是字母,则为true
iscntrl(c) 如果c是控制字符,则为true
isdigit(c) 如果c是数字,则为true
isgraph(c) 如果c不是空格,但可以打印,则为true
islower(c) 如果c是小写字母,则为true
isprint(c) 如果c是可打印的字符,则为true
ispunct(c) 如果c是标点符号,则为true
isspace(c) 如果c是空白字符,则为true
isupper(c) 如果c是大写字母,则为true
isxdigit(c) 如果c是十六进制数,则为true
tolower(c) 如果c是大写字母,则返回其小写字母形式,否则直接返回c
toupper(c) 如果c是小写字母,则返回其大写字母形式,否则直接返回c
用getline读取整行文本
只要getline遇到换行符,即便它是输入的第一个字符,getline也将停止读入并返回,如果第一个字符就是换行符,则string参数将被设置为空string。
<span style="font-size:18px;">int main()
{
string line;
while(getline(cin,line))
cout << line <<endl;
return 0;
}</span>
<span style="font-size:18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">习题3.5:</span>
<span style="font-size:18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">编写程序<span style="font-size:18px;">实现从标准输入每次读入一行文本,然后改写程序,每次读入一个单词。</span></span>
<span style="font-size:18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:18px;">int main()
{
string s1;
while(getline(cin,s1))
{
cout << s1 <<endl;
}
return 0;
}
</span></span>
<span style="font-size:18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:18px;">int main()
{
string s1;
while(cin >> s1)
{
cout << s1 <<endl;
}
return 0;
}
</span></span>
vector类型:
vector<int> ivec;
上面的第一个定义,类型是vector<int>,该类型即是含有若干int类型对象的vector,变量名为ivec.vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector类型的每一种都指定了其保存元素的类型。因此,vector<int>和vector<string>都是数据类型。
vector对象的定义和初始化:
vector<t> v1; vector保存类型为t的对象,默认构造函数,v1为空
vector<t> v2(v1); v2是v1的一个副本
vector<t> v3(n,i); v3包含n个值为i的元素
vector<t> v4 (n); v4含有值初始化的元素的n个副本
当把一个vector对象复制到另一个vector对象时,新复制的vector中每一个元素都初始化为原vector中相应元素的副本,但这两个vector对象必须保存同一种元素类型。
vector 对象的操作:
v.empty() 如果v为空,则返回true,否则返回false
v.size() 返回v中元素的个数
v.push_back(t) 在v的末尾增加一个值为t的元素
v[n] 返回v中位置为n的元素
v1=v2 把v1的元素替换为v2中元素的副本
v1==v2 如果v1与v2相等,则返回true
vector实例1:
int main()
{
int x;
/*用下标计算并输出每对相邻元素的和,如
果读入元素个数为奇数,则提示用户最后一个元素
没有求和,并输出其值,然后修改程序,头尾元素两两
配对,计算每对元素的和并输出*/
vector<int> a;
while(1)
{
cin >> x;
if(x==0) break;
a.push_back(x);
}
cout << a.size() << endl;
for(vector<int>::size_type ix=0;ix<a.size()-1;ix+=2)
{
cout << a[ix]+a[ix+1] << endl;
}
if(a.size()%2!=0)
cout << "最后一个没有求和:" << a[a.size()-1] << endl;
vector<int>::size_type iy=0,iz=a.size()-1;
while(iy<iz)
{
cout << a[iy]+a[iz] << endl;
iy++;
iz--;
}
if(iy==iz)
cout << "中间有剩余: " << a[iy] << endl;
/*用迭代器计算并输出每对相邻元素的和,如
果读入元素个数为奇数,则提示用户最后一个元素
没有求和,并输出其值,然后修改程序,头尾元素两两
配对,计算每对元素的和并输出*/
vector<int> b;
while(1)
{
cin >> x;
if(x==0) break;
b.push_back(x);
}
cout << b.size() <<endl;
for(vector<int>::iterator iter=b.begin();iter!=b.end()-1;iter+=2)
{
cout << *iter+*(iter+1) <<endl;
}
if(b.size()%2!=0)
cout <<"最后一个数没有求和: "<< *(b.end()-1) <<endl;
vector<int>::iterator first=b.begin(),last=b.end()-1;
while(first<last)
{
cout << *first + *last << endl;
first++;
last--;
}
if(first==last)
cout<<"居中元素没有求和: " << *first <<endl;
return 0;
}
vector实例2:
int main()
{
/*
读入一段文本到vector对象,每个单词存储为vector中的一个元素
把vector对象中每个单词转化为大写字母
输出vector对象中转化后的元素,每8个单词为一行输出
用下标访问vector中的元素
*/
vector<string> str;
string ch;
while(cin >> ch)
{
if(ch=="aaa")
break;
for(int i=0;i<ch.length();i++)
{
ch[i]=toupper(ch[i]);
}
str.push_back(ch);
}
for(vector<string>::size_type ix=0;ix!=str.size();ix++)
{
cout << str[ix] <<" ";
if((ix+1)%8==0)
cout << endl;
}
/*
读入一段文本到vector对象,每个单词存储为vector中的一个元素
把vector对象中每个单词转化为大写字母
输出vector对象中转化后的元素,每8个单词为一行输出
用迭代器访问vector中的元素
*/
vector<string> str1;
string ch1;
while(cin >> ch1)
{
if(ch1=="aaa") break;
for(int i=0;i<ch1.length();i++)
{
ch1[i]=toupper(ch1[i]);
}
str1.push_back(ch1);
}
vector<string>::size_type cnt=0;//定义
for(vector<string>::iterator iter = str1.begin(); iter != str1.end(); iter++)
{
//使用类型为vector<string>::iterator的迭代器,访问元素类型为string的vector对象中的元素
cout << *iter <<" ";
cnt++;
if(cnt % 8 == 0) cout << endl;
}
return 0;
}
vector实例3:
int main()
{
/*
编写程序来创建有10个元素的vector对象,用迭代器把每个元素值改为当前值的2倍。
*/
vector<int> num(10,5);
for(vector<int>::iterator iter=num.begin(); iter != num.end(); iter++)
{
//使用类型为vector<int>::iterator的迭代器,访问元素类型为int的vector对象中的元素
*iter = (*iter)*2;
cout << *iter <<" ";
}
return 0;
}