今天有必要在把以前血的string和vector这两种类型再详细的说一下!!
简单介绍一下几种初始化string对象的方式:
String s1; //默认构造函数,s1为空串.
String s2(s1); //将s2初始化为s1.
String s3(“hello world”); //将s3初始化为一个字符串
String s4(n,’c’); //将s4初始化为n个’c.
首先string的读写.
他读取并忽略开头所有的空白字符(如空格,换行符,制表符).
读取字符直至再次遇到空白字符,读取终止.
例如想要读入未知数目的string对象
<span style="font-size:18px;"><strong>#include <iostream>
using namespace std;
int main()
{
string a;
while(cin>>a)
{
cout<<a<<endl;
}
return 0;
}</strong></span>
改程序只能实现一个单词的输出.
而如果想要实现一个文本的输出,则需要如下程序,需要getline读取整行文本.
<span style="font-size:18px;"><strong>#include <iostream>
using namespace std;
int main()
{
string a;
while(getline(cin,a))
{
cout<<a<<endl;
}
return 0;
}</strong></span>
String对象的操作:string s;
S.empty() 如果s为空则为真,否则为假.
S.size() 返回s中字符串的个数.
s[n] 返回s中位置为n的字符,位置从0开始计数.
<span style="font-size:18px;"><strong>#include <iostream>
using namespace std;
int main()
{
string a;
cin>>a;
cout<<"the size of "<<a<<" is "<<a.size()<<" characters, including the newline"<<endl;
return 0;
}</strong></span>
如果想要判断string对象是否为空就更简单了,可以利用size是否为0.程序如下:
if(s.size()==0)进行判断.empty()成员函数将返回bool值.空位对,否则为错.
Size操作返回的是string::size_type类型的值.任何存储string的size操作结构的变量必须为string::size_type类型.特别重要的是,不要把size的返回值赋给一个int变量.
String对象比较操作是区分大小写的,即同一个字符的大小写形式被认为是两个不同的字符.在多数计算机上,大写的字母位于小写字母之前,任何一个大写字母都小于任意的小写字母.
关系操作符比较两个string对象是采用了和字典排序相同的策略.
1.如果两个string对象长度不同,且短的string对象与长的string对象的前面部分相同,则短的string对象小于长的string对象.
2.如果两个string对象不同,则比较第一个不匹配的字符.
例如:
string a="Hello";
string b="Hello World";
string c="Hiya";
由以上规律可知:a<b;c>a;c>b;
String对象和字符串面值的连接
String对象和字符串面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型;
String s1=”hello”;
String s2=”world”;
String s3=s1+”, ”;
String s4=”hello”+”, ”; //这是不对的,因为不能使用字符串面值进行向加.
String s5=s1+”, ”+”world”;//这是可以的,因为首先s1+”,”得到的结果是string类型的,string类型的再加上”world”还是string类型的.
String s6=”hello”+”, ”+s2; //这是不对的,为啥呢?因为企图将两个字符串面值进行相加.
从string对象获取字符
首先要知道string对象的下表是从0开始.如果s是一个string且不空,则s[0]就是第一个元素,s[1]就是第二个元素(我这里用的名称是元素,也可以称为字符),而s[s.size()-1]则表示s的最后一个元素.例如:
<span style="font-size:18px;"><strong>#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string a="some string";
for(string :: size_type i=0;i!=a.size();i++)
{
cout<<a[i]<<endl;
}
return 0;
}
赋值也是一样的.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string a="some string";
for(string :: size_type i=0;i!=a.size();i++)
{
a[i]='*';
}
cout<<a<<endl;
return 0;
}</strong></span>
计算下标值
需要注意的是在使用下标索引string对象时,必须保证索引值”在上下界范围内”.”在上下界范围内”就是指索引值是一个赋值为size_tpye类型的值,其取值范围在0到string对象长度减1之间.
值得主要的一点事,标准库不要求检查索引值,所用所引致的下标越界是没有定义的,这样往往会导致严重的运行时错误.
string对象中字符的处理
对各种字符的操作函数都包含在cctype头文件中.
例如:c是string对象中的一个元素. tolower(c) 如果c是大写字母,返回其小写字母,否则直接返回c;
同理还有toupper(c) . 如果c是小写字母,则返回其大写字母形式,否则直接返回c.
例如:
<span style="font-size:18px;"><strong>#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string a="Some Nothing!!";
for(string :: size_type i=0;i!=a.size();i++)
{
a[i]=tolower(a[i]);
}
cout<<a<<endl;
return 0;
}</strong></span>
还有一个ispunct(c),如果c是可打印的字符,则为真.
例如:
<span style="font-size:18px;"><strong>#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string a="Some Nothing!!";
int s=0;
for(string :: size_type i=0;i!=a.size();i++)
{
if(ispunct(a[i]))
s++;
}
cout<<s<<" punctuation characters in "<<a<<endl;
return 0;
}</strong></span>
标准库vector类型
首先vector包含在#include<vector>头文件中.vector是同一类型对象的集合,每个对象都有一个对应的整数索引值.
Vector是一个类模板.使用类模板可以编写一个类定义或函数定义,而用于多个不同的数据类型.
几种初始化vrctor对象的方式
Vector <T> v1; //vector保存类型为T的对象默认构造函数,v1为空.
Vector <T> v2(v1); //v2是v1的一个副本
Vector <T> v1(n,i); //v3包含n个值为i的元素
Vector <T> v1(n); //v4含有值初始化的元素的n个副本
创建确定个数的元素:
Vector <int> ivec1;
Vector <int>ivec2(vec1);
Vector <string>svec(ivec1); //这是错误的.
当把一个对象复制到另一个对象vector对象时,新复制的vector对象的每一个元素都初始化为元vector中相应元素的副本.但是这两个vector对象必须保存同一种元素类型!!
Vector <int> ivec1(10,-1); //10个int型,每一个都是-1;
Vector <string> svec(10,”hi”) //10个string型,每个都是”hi!”
Vector对象(以及其他对象标准库容器对象)的重要属性就在于可以在运行时高效的添加元素.因为vector的增长效率高,当元素已知时,最好是通过动态的向他添加元素来让他增长.
需要注意的是:虽然可以对给定元素的vector对象预先分配内存,但更有效的方法是先初始化一个空vector对象,然后再动态的增加元素.
值初始化
如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值惊醒值初始化.
例如:vector <int> fvec(10); //10个int型的数,每个都是0.
Vector <string> svec(10);//10个string型,每个都为空.
对vector的操作
V.empty() 如果v为空,则返回真,否则为假
V.size() 返回v中的元素个数
V.push_back(t) 在 v的末尾增加一个值为t的元素
和string相同的是,vector的成员函数size返回相应vector类定义的size_type的值.
但是在使用size_type类型是,需要指出该类型是在哪里定义的.vector类型总是包括vector的元素类型.例如:
Vector <int>::size_type
想vector添加元素
<span style="font-size:18px;"><strong>#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int main()
{
string word;
vector <string> text;
while(cin>>word)
{
text.push_back(word);
}
for(vector<string>::size_type i=0;i!=text.size();i++)
{
cout<<text[i]<<" ";
}
return 0;
}</strong></span>
使用for循环把vector中的每个元素的值都重载为0.
for(vector<int>::size_type i=0; i!=text.size(); i++)
{
Ivec[i]=0;
}
在元素添加时一般能想到的是这样:
Vector <int>ivec;
for(vector <int>::size_type i=0;i!=10;i++)
{
Ivec[i]=i;
}
这是错误的!!
因为ivce是的vector对象,而且下标只能用于获取已存在的元素.
这个循环正确的写法应该是:
Vector <int>ivec;
for(vector <int>::size_type i=0;i!=10;i++)
{
Ivce.puvh_back(i);
}
注意:必须事已存在额的元素才能用下标操作符进行索引.通过下表进行赋值时,不会添加任何元素.仅能对确知已存在的元素进行下标操作.
Vector <int> ivec
cout<<ivec[0]; //这是错误的,因为ivec没有元素.
Vector <int> ivec2(10);
cout<<ivec2[10]; //这是错误的,因为元素下标是从0到9的,没有10这个元素.