【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_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)为何使用迭代器

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

              











           

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值