【C++ Primer】第十六章 string类和标准模板库

一,string类

1)构造函数

string()

string(const char *s)

string(size_type n,char c)//包含n个元素的string 全部初始化为 c

string(const char *s,size_type n)//初始化为s指向的前n个字符

示例:

#include <iostream> #include <string> using namespace std; int main() { string one("NEU Locate in shengyang"); cout<<one<<endl; string two(20,'#'); cout<<two<<endl; string three(one); cout<<three<<endl; string four; four=one+" realy?"; cout<<four<<endl; char a[]="NEU is a famous school "; string five(a,3); cout<<five<<endl; string six(a+4,a+15); cout<<six<<endl; string seven(&a[4],&a[15]); cout<<seven<<endl; }

2)string类输入

C-风格字符串输入:

char info[100]; cin>>info; cin.getline(info,100); cin.get(info,100); C++风格输入:string stuff; cin>>stuff; cin.getline(stuff,100); 两个版本的getline 都有一个共同可选参数,getline(stuff,';');//结束边界

string 的getline()函数从输入中读取字符,并将其存储到string中,直到发生下列3中:遇到文件结尾、遇到分节符(\n)、读取字符数到达最大

3)使用string

size_typefind(string _Ch, size_type _Off = 0) const; // 从_Off开始查找_Ch,返回index。
size_typefind(const char * _Ptr,size_type _Off = 0) const; // 从_Off开始查找_Ptr
size_typefind(const char * _Ptr, size_type _Off,size_type _Count) const; // 从_Off开始查找_Ptr的前_Count个子串,有意义吗?
size_typefind(const basic_string<CharType, Traits, Allocator>& _Str,size_type _Off = 0) const; // 从_Off开始查找_Str

示例:

#include <iostream> #include <string> using namespace std; #define Print( exp )\ /*这里的换行符('\')值得注意 #也值得注意*/ {\ string::size_type pos = exp; \ if( pos != string::npos ) \ cout<< #exp <<"="<< pos << endl;\ else\ cout<< #exp <<"= 找不到" << endl;\ } int main( ) { string ss( "Hello World!_Hello World!" ); cout<< ss <<endl; Print( ss.find('o') ); // 直接查找o Print( ss.find('o', 5 ) ); // 从开始查找o Print( ss.find("He") ); Print( ss.find("He",10) ); Print( ss.find("Hello_") ); Print( ss.find("Hello_",0,5 ) ); // 注意这个和上面的区别 Print( ss.find("Hello_",1,5 ) ); cout<<endl; string res("World"); cout<< res <<endl; Print( ss.find( res,3 ) ); return 0; }

4)string 还提供了哪些功能

自动调整大小:string增加字符,是不是仅仅将已有字符加大,但相邻内存有可能被占用。从新分配一个新内存,将原来内容复制到新内存,但是频繁的这样操作效率会很低。C++如何做呢? 分配一个比实际字符串大的内存块,为字符串提供增大空间。如果字符串不断增大,超过内存块,程序分配一个为原来两倍的新内存。

示例:

#include <iostream> #include <string> using namespace std; int main() { string empty; string small="bit"; string larger="Elephants are a gril's best friend"; cout<<"Size:\n"; cout<<"\t empty:"<<empty.size()<<endl; cout<<"\t small:"<<small.size()<<endl; cout<<"\t larger:"<<larger.size()<<endl; cout<<"Capacities:\n"; cout<<"\t empty:"<<empty.capacity()<<endl; cout<<"\t small:"<<small.capacity()<<endl; cout<<"\t larger:"<<larger.capacity()<<endl; empty.reserve(50);//reserve 让您能够请求内存块的最小长度 cout<<"Capacity after empty.reserve(50):"<<empty.capacity()<<endl; return 0; } 使用C-Free实验结果

不知道为什么跟书上结果不一样???等待答案……


二,auto_ptr类

1)模板类,动态分配对象以及当对象不再需要时自动执行清理

2)void remodel(string &str)

{

string *ps=new string(str);

str = ps;

delete ps;

return;

}

三,STL Standard Template Library,标准模板库

1)简介:STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用额外安装什么.

2)vector(矢量)之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据

示例:

#include <iostream> #include <string> #include <vector> using namespace std; const int NUM = 5; int main() { vector<int> ratings(NUM); vector<string> titles(NUM); int a[NUM]={2,3,4,5,6}; string b[NUM]={"AA","BB","CC","DD","EE"}; for(int i=0;i<NUM;++i) { ratings[i]=a[i]; titles[i]=b[i]; } for(int j=0;j<NUM;++j) { cout<<ratings[j]<<"\t"<<titles[j]<<endl; //cout<<ratings.at(j)<<"\t"<<titles.at(j)<<endl;//另一种表达方式 } return 0; } 3)迭代器( iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规 指针的接口,所谓迭代器是一种概念上的抽象:那些行为上象迭代器的东西都可以叫做迭代器

迭代器提供一些基本操作符:*、++、==、!=、=。

#include <iostream> #include <string> #include <vector> using namespace std; const int NUM = 5; int main() { vector<int> ratings(NUM); vector<int>::iterator pd; pd=ratings.begin(); *pd=5; cout<<*pd<<endl; int a[NUM]={2,3,4,5,6}; for(int i=0;i<NUM;++i) { ratings[i]=a[i]; } for(pd=ratings.begin();pd!=ratings.end();pd++) { cout<<*pd<<endl; } return 0; }四,通用编程技术

面向对象编程关注的是编程的数据方面,而通用编程技术关注的是算法。

通用程序工具:模板、迭代器

1)为何使用迭代器

模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值