VC大讲堂_体会

最近学习STL。阙海忠的讲义看了前言,还是有些感悟。记录自己认为重要的,以便转化成自己的知识。

STL实用入门教程第一讲。

两个问题。

一、什么是STL,使用STL的好处;

二、STL的string类型的使用方法。

STL(Standard Template Library,标准模板库),它是由惠普实验室开发的一系列标准化的组件,目前是C++的一部分。
STL的代码从广义上讲分为三类:container(容器)、iterator(迭代器)和algorithm(算法),容器和算法通过迭代器可以进行无缝地连接。
string,wstring也是STL的一部分。
 
STL 的组成及内部关系
 
STL是C++的一部分,因此不用额外安装什麽,它被内建在你的编译器之内。
STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但是这种分离确实使得STL变得非常通用。例如,STL的sort()函数可以用来操作vector,list等容器。
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实用入门教程第二讲。

问题一:什么是容器?

               容器是用来存放、管理一组元素的数据集合。
               容器的数据结构示意图:
              

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值