1
、
std::string
的使用
3、为什么会出现大量的警告信息
4、multimap 模板类的用法
5、map模板类的用法
=========================================================================================================
1、std::string的使用
注意:需加入头文件<string>,若加上using namespace std;就不必在string前加std
std::string s1 = "Hello";
std::string s2 = "world";
std::string s3 = s1 + ", " + s2 + "!/n";
printf("%s/n",s3.c_str());
std::string name = "Niels Stroustrup";
std::string s = name.substr(6, 10);
name.replace(0, 5, "Nicholas");
=========================================================================================================
2、STL分为三大部分:算法、容器和迭代器。三个部分是相互独立的。
容器,比如vector,是类似数组的容器(vector在std命名空间内,所以要直接引用要加上using namespace std;)
vector<int> v(3); // 定义一个有三个元素的数组,元素是int型(需要头文件<vector>)
v[0] = 7;
v[1] = v[0] + 3;
v[2] = v[0] + v[1]; // 使用起来和一般的数组一样
而该容器还可以装其它类型的数据,如string
vector<string> Tongue_Twister(3);
Tongue_Twister[0] = "she" ;
Tongue_Twister[1] = "sells" ;
Tongue_Twister[2] = "sea" ; //
具有统一的赋值方式
,
不管其为什么类型
由上面的例子看出容器和数据类型是独立的
,
而算法又和容器是互相独立的
如
std::reverse,
该算法用来实现元素的倒置
(
需头文件
#include <algorithm>)
std::reverse(v.begin(), v.end()); //
倒置
int
std::reverse(Tongue_Twister.begin(), Tongue_Twister.end()); //
倒置
string
不管其操作的数据是什么类型,使用的方式都是一样的
即使是普通的数组,也可以用
double A[6] = { 1.2, 1.3, 1.4, 1.5, 1.6, 1.7 };
std::reverse(A, A + 6);
那么
reverse
是参数是什么
,
迭代器
(
如上
,
普通的指针也是一种迭代器
)
v.begin()
和
v.end()
返回的类型是
vector<int>::iterator
Tongue_Twister.begin()
返回的类型是
vector<string>::iterator
以下是如何遍历容器内的元素
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout<<*it;
int x = *it;
*it = xx; // 迭代器使用起来如同指针
}
// 要得到更多信息,可用下面的关键词去搜索MSDN
算法
:reverse sort copy
容器:
vector :该模板类描述一个由类型T元素组成的可变长队列,该队列保存成一个T类列数组
list:该模板类描述一个由类型T元素组成的可变长队列,该队列保存成一个T类列的双向链表
(比较好的例子:http://www.vckbase.com/document/viewdoc/?id=781)
map:一种关系式容器,可以根据关键字匹配多种数(下面是应用的一个例子)
class CDivMap
{
public:
typedef std::map<string, string> type_map;
enum { NO_ELEMENT = 0 ,
VALUE_SAME = 1 ,
VALUE_NOSAME = 2
};
CDivMap(){}
~CDivMap()
{
if( !m_map.empty() )
m_map.clear();
}
int Compare(char * strKey , char *strVal)
{
if( m_map.empty() )
{
//m_map.insert( type_map::value_type( strKey , strVal ) );
这两种写法都可以
m_map[strKey] = strVal;
return NO_ELEMENT;
}
else
{
type_map::iterator it = m_map.find( strKey );
if( it == m_map.end() )
{
//
未找到
//m_map.insert( type_map::value_type( strKey , strVal ) );
这两种写法都可以
m_map[strKey] = strVal;
return NO_ELEMENT;
}
else
{
if( lstrcmpA( it->second.c_str() , strVal ) == 0 )
return VALUE_SAME;
else
{
it->second = strVal;
return VALUE_NOSAME;
}
}
}
}
int Count() const
{
return m_map.size();
}
void print()
{
type_map::iterator it;
for(it = m_map.begin();it!=m_map.end();++it)
printf("%s %s/n",it->first.c_str(),it->second.c_str());
}
protected:
type_map m_map;
};
=========================================================================================================
3、为什么会出现大量的警告信息
编译时请加上/GX和/MT参数。
前一个参数用于告知编译器允许异常处理(Exception Handling)。在P. J. Plauger STL中的很多地方使用了异常处理机制(即try…throw…catch语法),所以应该加上这个参数,否则会有如下警告信息:
warning C4530: C++ exception handler used, but unwind semantics are not enabled.
后一个参数则用于使程序支持多线程,它需要在链接时使用LIBCMT.LIB库文件。不过P. J. Plauger STL并不是线程安全的(thread safety)。如果你是在VC环境下使用像STLport这样的STL实现版本,则需要加上这个参数,因为STLport是线程安全
有时,在IDE环境下编译STL程序时,可能会出现如下警告信息(前面那几个示例程序不会出现这种情况):
warning C4786: '……' : identifier was truncated to '255' characters in the debug information
这是因为编译器在Debug状态下编译时,把程序中所出现的标识符长度限制在了255个字符范围内。如果超过最大长度,这些标识符就无法在调试阶段查看和计算了。而在STL程序中大量的用到了模板函数和模板类,编译器在实例化这些内容时,展开之后所产生的标识符往往很长(没准会有一千多个字符!)。如果你想认识一下这个warning的话,很简单,在程序里加上如下一行代码:
vector string_array; // 类似于字符串数组变量
对于这样的warning,当然可以置之不理,不过也是有解决办法的。 你可以在文件开头加入下面这一行:#pragma warning(disable: 4786)。它强制编译器忽略这个警告信息,这种做法虽然有点粗鲁,但是很有效。
========================================================================================================
4、multimap 模板类的用法
参考:http://www.vckbase.com/document/viewdoc/?id=1398
multimap
容器,它与
map
类似,所不同的是它允许重复键。比如在电话簿中相同的人可以有两个以上电话号码
插入
multimap <string, string> phonebook;
string name = "zheng";
string tel = "8226336";
phonebook.insert( make_pair(name , tel) ); // make_pair
可以参考
:http://www.vckbase.com/document/viewdoc/?id=1377
的
“
Pair
和
Map
”
部分
查找单个值
multimap<string,string>::iterator it = phonebool.find("zheng");
返回第一个匹配的指针。
当你想要检查是否存在至少一个与该键关联的值时,或者只需第一个匹配时,这个函数最有用
查找关联的所有值
typedef multimap <string, string>::const_iterator CIT;
typedef pair<CIT, CIT> Range;
Range range = phonebook.equal_range("zheng");
for(CIT i=range.first; i!=range.second; ++i)
{
printf("=%s/n",i->second.c_str());
}
返回与给定键关联的值得数量
phonebook.count("zheng")
upper_bound()
:
lower_bound(k)
的用法参考前面给出的
URL!
========================================================================================================
5
、
map
模板类的用法
参考
:http://www.vckbase.com/document/viewdoc/?id=1377
赋值
map <string, string> addresses;
addresses["zheng"]="paul@mail.com";
addresses["zheng"]="newaddr@com.net"; // 不起作用 ,
注意
,如果该
map 已经包含了此键值,那么当前所关联的值不会改变
,
但可以累加
"+="
转载请注明原文地址: https://ibbs.8miu.com/read-22067.html