一,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_type find(string _Ch, size_type _Off = 0) const; // 从_Off开始查找_Ch,返回index。
size_type find(const char * _Ptr,size_type _Off = 0) const; // 从_Off开始查找_Ptr
size_type find(const char * _Ptr, size_type _Off,size_type _Count) const; // 从_Off开始查找_Ptr的前_Count个子串,有意义吗?
size_type find(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)为何使用迭代器
模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型