首页 > 代码库 > string 和 vector 初探

string 和 vector 初探

标准库类型 string

        string 表示可变长的字符序列。是C++标准库类型的一部分,拥有很多优秀的性能。

        定义 string 对象时如未人为初始化编译器会默认初始化为空字符串。

        string 对象的初始化有非常多种。大体分为两类:拷贝初始化直接初始化

全部用等号(=)的初始化都为拷贝初始化。相反不是等号则为直接初始化。

当初始值仅仅有一个时,拷贝和直接初始化都可,但须要用到多个值的时候,一般来说仅仅能使用直接初始化。

 建议尽量使用直接初始化。

string s1;//默认初始化为空串
string s2=s1;//拷贝初始化,s2是s1的副本
string s3(n,"c");//直接初始化,s3为连续n个c构成的字符串


 

        在读取 string 对象时,string 对象会自己主动忽略开头的空白空格。制表符,运行符等)并从第一个真正的字符開始读取直到遇见下一个空白为止。

        getline 函数能够读取一整行包含字符串中的空白。getline函数的參数是一个输入流和一个 string 对象。将输入流中读取的一行字符串存入 string 对象中。当 getline 遇到转行符时就结束并返回结果(getline 是读取转行符的,可是结果中是将转行符丢弃的)。

string line;
while(getline(cin,line))//重复读取输入流,知道遇见结束标志EOF
         cout<<line<<endl;输出每一行并手动加入换行操作


 

        string 的 size()(string 类的封装函数) 操作返回 string 对象的长度,返回类型为 string::size_type。这是一个神奇的类型技术分享,仅仅知道它是一个无符号整形。而且能存放下不论什么 string 对象的大小。

既然函数返回值是无符号整数就不能与有符号数进行比較。由于当无符号数与负值比較时,负值会自己主动转变为一个比較大的无符号数。使比較结果出错。

string line;
auto len = line.size();//len 是size_type类型,值为0。line 是个空串


 

       string 类定义了比較字符串的运算符。当两个 string 对象全然同样时,这两个string 相等(==);

       其它比較如 < ‘。<= 。> ,>= 。string 对象遵循两个原则:

              1.当一个string 对象A长度小于 string 对象B长度。且A与B于A长度上的字符皆同样时,A < B。

              2.假设两个 string 对象在某些相应的位置上不一致,则string 对象比較的结果是第一个相异字符比較的结果(遵循大写和小写敏感的字典序)。

string str = "Hello";
string phrase = "Hello World";
string slang = "Hiya";
//由规则 1 推断,phrase 大于 str。由规则 2 推断 phrase 大于 str 和 slang


 

        string 对象重载了 + 运算符,通过 + 运算符能够实现 string 与string 。字面值及字符串字面值之间的衔接。

(字符串字面值与 string 是不同的类型)字面值及字符串字面值不能直接相加,由于 + 运算符是封装与 string 类中的。

string s1("Hello") , s2(" World");
string s3 = s1 + s2;//s3 的内容是 Hello World
string s4 = s1 + ‘,‘;//s4 的内容是 Hello,
string s5 = s1 + ", World";//s5 的内容是 Hello, World


 

标准库类型 vector

        vector 表示同一种对象的集合。vector 是一个类模板,vector 本身不是类。但却是编译器生成类的说明,当使用模板实例化类时必须指明实例化成何种类型,vector 使用尖括号 <> 来指明实例化类型。vector 能容纳绝大多数对象作为其元素(引用除外。引用不是对象),甚至 vector 本身。

        vector 的初始化同 string 同样,另外C++11 还为 vector 加入了列表初始化的方法。用花括号括起来的0个或多个初始元素值被赋给 vector 对象。

vector<string> vs = {"cs","dn"};


 

        列表初始化会给阅读带来混淆,由于列表中的值既能够表示初始值也能够表示元素数量,编译器会首先觉得是列表初始化(将列表中的值当作初始值来处理)。假设不行,才会考虑其它初始化方式。

vector<int> v1(10);//v1有10个元素,都为0
vector<int> v2{10};//v2有1个元素。为10
vector<int> v3(10,1);//v3有10个元素,都为1
vector<int> v4{10,1};//v4有两个元素。10和1
vector<string> v5{"Hello","Hi"};//v5有两个元素,列表初始化
vector<string> v6{10};//v6有10个空串元素


 

        向 vector 中加入元素必须使用 vector 的成员函数 push_back() 。将一个值加入到 vector 的末尾。

不能使用下标运算符。 下标运算符仅仅是用来訪问 vector(string) 对象已存在的元素。下标运算符的使用必须确保其在合理范围内(大于 0 且小于容量)。

        vector若要使用 size_type 类型必须明白指出其是由哪一类型定义的。

vector<int>::size_type;//正确
vector::size_type;//错误


 

        vector 对象中元素的仅仅有在元素本身支持比較运算符的基础上才干进行比較(有些自己定义类并未定义比較运算符)。

 

范围 for 语句

         范围 for 语句遍历给定范围内的每个元素。并对序列(序列能够是用花括号括起来的初始值列表。数组,vector,string等对象。这些类型的共同特点是拥有能返回迭代器的 begin end 成员)中的每个元素进行某种操作。使用范围 for 语句能够无需关系是否超出有效范围。

 

string str("Hello World");
for(auto c : str)//遍历 str 每个字符元素
     cout<< c <<endl;


 

 

 

string 和 vector 初探