string和vector

今天有必要在把以前血的stringvector这两种类型再详细的说一下!!

简单介绍一下几种初始化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类型的值.任何存储stringsize操作结构的变量必须为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类型的值,其取值范围在0string对象长度减1之间.

值得主要的一点事,标准库不要求检查索引值,所用所引致的下标越界是没有定义的,这样往往会导致严重的运行时错误.

            string对象中字符的处理

对各种字符的操作函数都包含在cctype头文件中.

例如:cstring对象中的一个元素. 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);  //v2v1的一个副本

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);    //10int,每一个都是-1;

Vector <string> svec(10,”hi”)  //10string,每个都是”hi!”

Vector对象(以及其他对象标准库容器对象)的重要属性就在于可以在运行时高效的添加元素.因为vector的增长效率高,当元素已知时,最好是通过动态的向他添加元素来让他增长.

 

需要注意的是:虽然可以对给定元素的vector对象预先分配内存,但更有效的方法是先初始化一个空vector对象,然后再动态的增加元素.

值初始化

如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值惊醒值初始化.

例如:vector <int> fvec(10);  //10int型的数,每个都是0.

Vector <string> svec(10);//10string,每个都为空.

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];    //这是错误的,因为元素下标是从09,没有10这个元素.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值