STL用法点滴(不断添加中)

 
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 已经包含了此键值,那么当前所关联的值不会改变 ,    但可以累加 "+="
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值