`
evasiu
  • 浏览: 165537 次
  • 性别: Icon_minigender_2
  • 来自: 广州
博客专栏
Fa47b089-e026-399c-b770-017349f619d5
TCP/IP详解卷一>阅读...
浏览量:12264
社区版块
存档分类
最新评论

c++ premier -- 标准库类型

 
阅读更多

这一章主要介绍了三种c++标准库类型,包括string, vector和bitset。另外还介绍了迭代器的一些操作。

 

1. string

初始化string对象的几种方式:

string s1;                 //default constructor, s1 is an empty string
string s2(s1);           //s2 is initialized as a copy of s1
string s3("value");   //s3 is initialized as a copy of "value"
string s4(n, 'c');        //s4 is a string of n characters of 'c'

 之前使用string的时候,好像一直就把它跟char* s一样定义了,书中明确强调了字符串字面值 与标准库string类型不是同一种类型。具体可以体现在,两个string可以相加,变成新的string,而两个char* 是不能相加的。

例如:

string s1 = "hello~";
string s2 = "welcome ";
string s3 = s1 + s2 ; //两个string相加,形成新的string
string s4 = s3 + "to eva's blog!"; //string可以跟字符串字面值混合连接得到新的string
string s5 = "hello~" + "welcome"; //这是非法的,当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的。

 另外,string.size()返回对象的长度,即对象中字符的个数,其类型是string::size_type. string中对单字符的处理函数如isalnum(c)等都定义在cctype头文件中。

 

2. vector

vector是一个类模板,使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。

vector<int> ivec; 
vector<string> svec;

 初始化vector的几种方式:

vector<T> v1;    //默认构造函数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对象,然后再动态地增加元素”(用push_back函数),意思大概没有理解错,但是为什么就不是很明白了。书中提到第9章探讨,先记在这里。

和string一样的是,vector.size()返回的数据类型为vector::size_type. 但使用vector的size_type时,必须指出该类型是在哪里定义的,vector类型总是包括vector的元素类型。

vector<int>::size_type;   //ok
vector::size_type;           //error

 

3. iterator

标准库为每一种标准容器(包括vector)定义了一种迭代器类型。迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。

vector<int>::iterator iter;  //定义了一个名为iter的iterator
iter = ivec.begin();             //初始化iter为由名为begin的vector操作返回的值

 vector可以进行自增和解引用运算。

假设iter指向vector对象ivec的第一个元素, *iter=0和ivec[0]=0的效果一样。而++iter将指向ivec的第二个元素。

使用迭代器的一个例子:

vector<int> ivec(10);
for(vector<int>::iterator iter = ivec.begin(); iter != iter.end(); ++iter)
     *iter = 1;         //把iter指向的元素设为1

可以利用vector::iterator改变vector中的元素值,当我们只需要读取容器内元素而不对其进行改变时,可以使用vector::const_iterator类型。

而const的iterator与const_iterator又是不一样的,声明一个const迭代器时,必须初始化迭代器,一旦被初始化后,就不能改变它的值,即迭代器指向的元素是不会改变的,但可以改变迭代器指向的元素的值。

const vector<int> nines(10, 9);
//error: cit2 could change the element it refers to but nines is const
const vector<int>:: iterator cit2 = nines.begin();
//ok: it can't change an element value, so it can be used with a const vector<int>
vector<int>::const_iterator = it = nines.begin();
*it = 10; //error: *it   is const
++it;       //ok: it    isn't const, so we can change this value

 

4. bitset

好像从来没有用过bitset类型,不过很多操作都在预设之中。需要注意的是它的初始化方法:

bitset<n> b;          //b有n位,每位都为0
//用unsigned long值作为对象的初始值时,该值转化为二进制的位模式
//如果bitset类型长度大于unsigned long值的二进制位数,高位用0填充
//如果前者小于后者,unsigned long的高价位被丢弃
bitset<n> b(u);      //b是unsigned long型u的一个副本
bitset<n> b(s);      //b是string对象s中含有的串的副本
bitset<n> b(s, pos, n);  //b是s中从位置pos开始的n个位的副本

 

 

第三章基本上就这样了。想不到总结了一下花了我一个上午。。。今天还是七点起的床。。。下午要看论文啦~~~

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics