最近学习STL。阙海忠的讲义看了前言,还是有些感悟。记录自己认为重要的,以便转化成自己的知识。
STL实用入门教程第一讲。
两个问题。
一、什么是STL,使用STL的好处;
二、STL的string类型的使用方法。
STL(Standard Template Library,标准模板库),它是由惠普实验室开发的一系列标准化的组件,目前是C++的一部分。 STL的代码从广义上讲分为三类:container(容器)、iterator(迭代器)和algorithm(算法),容器和算法通过迭代器可以进行无缝地连接。 string,wstring也是STL的一部分。 STL的组成及内部关系高可重用性:STL中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。关于模板的介绍,在第二讲会讲解。
高性能:如map可以高效地从十万条记录里面查找出指定的记录,因为map是采用红黑树的变体实现的。(红黑树是平横二叉树的一种)
高移植性:如在项目A上用STL编写的模块,可以直接移植到项目B上。
跨平台:如用windows的Visual Studio编写的代码可以在Mac OS的XCode上直接编译。
string与wstring的区别string是对char*的管理,一个字符只占一个字节大小。一个汉字占两个字节,ASCII编码。wstring是对wchar_t*的管理,一个字符占两个字节大小,一个汉字占两个字节,Unicode编码。wstring的使用方法跟string类似,区别主要在于函数参数char*与函数参数wchar_t* string与wstring的转换第一种方法调用Windows的API函数:WideCharToMultiByte()函数和MultiByteToWideChar()函数。
第二种方法
使用ATL的CA2W类与CW2A类。或使用A2W宏与W2A宏。
第三种方法,跨平台的方法,使用CRT库的mbstowcs()函数和wcstombs()函数,需设定locale。 以下是第三种方法的实现例子。#include <string>
#include <locale.h>
using namespace std;
//wstring转成string
string ws2s(const wstring &ws)
{
string curLocale = setlocale(LC_ALL,NULL); //curLocale="C";
setlocale(LC_ALL,"chs");
const wchar_t * _Source=ws.c_str();
size_t _Dsize=2*ws.size()+1;
char * _Dest = new char[_Dsize];
memset(_Dest,0,_Dsize);
wcstombs(_Dest,_Source,_Dsize);
string result = _Dest;
delete[] _Dest;
setlocale(LC_ALL,curLocale.c_str());
return result;
}
//string转成wstring
wstring s2ws(const string &s)
{
string curLocale = setlocale(LC_ALL,NULL); //curLocale = "C"
setlocale(LC_ALL, "chs");
const char *_Source = s.c_str();
size_t _Dsize = s.size()+1;
wchar_t *_Dest = new wchar_t[_Dsize];
wmemset(_Dest,0,_Dsize);
mbstowcs(_Dest,_Source,_Dsize);
wstring result = _Dest;
delete[] _Dest;
setlocale(LC_ALL, curLocale.c_str());
return result;
}
²如果我们想建立两个版本的程序,一个处理ASCII字符串,另一个处理Unicode字符串,最好的解决办法是编写出既能按ASCII编译又能按Unicode编译的单一源代码。把以下代码加入到程序中,只要修改一个宏就能满足我们的要求。
#ifdef _UNICODE
typedef wstring tstring;
typedef wchar_t tchar;
#define _T(x) L ## x
#else
typedef string tstring;
typedef char tchar;
#define _T(x) x
#endif
STL实用入门教程第二讲。
问题一:什么是容器?
容器是用来存放、管理一组元素的数据集合。 容器的数据结构示意图: