﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-iniwf-随笔分类-STL</title><link>http://www.cppblog.com/iniwf/category/9830.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 19 Mar 2009 05:32:41 GMT</lastBuildDate><pubDate>Thu, 19 Mar 2009 05:32:41 GMT</pubDate><ttl>60</ttl><item><title>详细解说STL string</title><link>http://www.cppblog.com/iniwf/archive/2009/03/19/77146.html</link><dc:creator>iniwf</dc:creator><author>iniwf</author><pubDate>Thu, 19 Mar 2009 02:35:00 GMT</pubDate><guid>http://www.cppblog.com/iniwf/archive/2009/03/19/77146.html</guid><wfw:comment>http://www.cppblog.com/iniwf/comments/77146.html</wfw:comment><comments>http://www.cppblog.com/iniwf/archive/2009/03/19/77146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/iniwf/comments/commentRss/77146.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iniwf/services/trackbacks/77146.html</trackback:ping><description><![CDATA[转自<a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#FuncList">http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#FuncList</a><br><br>
<h2><a name=saMrj7qFFDskU></a>详细解说STL string </h2>
<div class=twikiToc>
<ul>
    <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#saMrj7qFFDskU"><u><font color=#4571d0>详细解说STL string</font></u></a>
    <ul>
        <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#sa0j6nWqFgzHQ"><u><font color=#4571d0>0 前言: string 的角色</font></u></a>
        <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#saSR1xxCyScSY"><u><font color=#4571d0>1 string 使用</font></u></a>
        <ul>
            <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#sa.kSde/WsOjg"><u><font color=#4571d0>1.1 充分使用string 操作符</font></u></a>
            <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#samXfCIojLCG6"><u><font color=#4571d0>1.2 眼花缭乱的string find 函数</font></u></a>
            <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#saVjopW.ELNL2"><u><font color=#4571d0>1.3 string insert, replace, erase</font></u></a> </li>
        </ul>
        <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#savp2ilvR/GkE"><u><font color=#4571d0>2 string 和 C风格字符串</font></u></a>
        <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#sa6BZN3S1oWUI"><u><font color=#4571d0>3 string 和 Charactor Traits</font></u></a>
        <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#sa6u8GaLNa5nc"><u><font color=#4571d0>4 string 建议</font></u></a>
        <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#saU/QHMminhLI"><u><font color=#4571d0>5 小结</font></u></a>
        <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#saz/DkMf62vwA"><u><font color=#4571d0>6 附录</font></u></a>
        <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#sa5F8ytFPy2ek"><u><font color=#4571d0>7 参考文章</font></u></a> </li>
    </ul>
    </li>
</ul>
</div>
<h3><a name=sa0j6nWqFgzHQ></a>0 前言: string 的角色 </h3>
C++ 语言是个十分优秀的语言，但优秀并不表示完美。还是有许多人不愿意使用C或者C++，为什么？原因众多，其中之一就是C/C++的文本处理功能太麻烦，用起来很不方便。以前没有接触过其他语言时，每当别人这么说，我总是不屑一顾，认为他们根本就没有领会C++的精华，或者不太懂C++，现在我接触perl, php, 和Shell脚本以后，开始理解了以前为什么有人说C++文本处理不方便了。
<p>举例来说，如果文本格式是：用户名 电话号码，文件名name.txt
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px">Tom 23245332
Jenny 22231231
Heny 22183942
Tom 23245332
...</pre>
</pre>
</div>
</div>
现在我们需要对用户名排序，且只输出不同的姓名。
<p>那么在<a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/ScriptShellTutorial"><u><font color=#4571d0>shell 编程</font></u></a>中，可以这样用：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=navy>awk</font> '<font color=blue>{print $1}</font>' name.txt | sort | uniq </pre>
</pre>
</div>
</div>
简单吧？
<p>如果使用C/C++ 就麻烦了，他需要做以下工作：
<ol>
    <li>先打开文件，检测文件是否打开，如果失败，则退出。
    <li>声明一个足够大得二维字符数组或者一个字符指针数组
    <li>读入一行到字符空间
    <li>然后分析一行的结构，找到空格，存入字符数组中。
    <li>关闭文件
    <li>写一个排序函数，或者使用写一个比较函数，使用qsort排序
    <li>遍历数组，比较是否有相同的，如果有，则要删除，copy...
    <li>输出信息 </li>
</ol>
你可以用C++或者C语言去实现这个流程。如果一个人的主要工作就是处理这种类似的文本(例如做apache的日志统计和分析),你说他会喜欢C/C++么？
<p>
<p>当然，有了STL，这些处理会得到很大的简化。我们可以使用 fstream来代替麻烦的fopen fread fclose, 用vector 来代替数组。最重要的是用 <a href="http://www.stlchina.org/stl_doc/basic_string.html" target=_top><u><font color=#4571d0>string</font></u></a>来代替char * 数组，使用<a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLSortAlgorithms"><u><font color=#4571d0>sort排序算法</font></u></a>来排序，用<a href="http://www.stlchina.org/stl_doc/unique.html" target=_top><u><font color=#4571d0>unique 函数</font></u></a>来去重。听起来好像很不错 <img title=smile alt=smile src="http://www.stlchina.org/twiki/pub/TWiki/SmiliesPlugin/smile.gif" border=0> 。看看下面代码(例程1）：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=navy>#include</font> &lt;string&gt;
<font color=navy>#include</font> &lt;iostream&gt;
<font color=navy>#include</font> &lt;algorithm&gt;
<font color=navy>#include</font> &lt;vector&gt;
<font color=navy>#include</font> &lt;fstream&gt;
<font color=brown>using</font> <font color=brown>namespace</font> std;
<font color=brown>int</font> main(){
ifstream in("<font color=blue>name.txt</font>");
string strtmp;
vector&lt;string&gt; vect;
<font color=brown>while</font>(getline(in, strtmp, '\n'))
vect.push_back(strtmp.substr(0, strtmp.find(' ')));
sort(vect.begin(), vect.end());
vector&lt;string&gt;::iterator it=unique(vect.begin(), vect.end());
copy(vect.begin(), it, ostream_iterator&lt;string&gt;(cout, "<font color=blue>\n</font>"));
<font color=brown>return</font> 0;
}</pre>
</pre>
</div>
</div>
也还不错吧，至少会比想象得要简单得多！（代码里面没有对错误进行处理，只是为了说明问题，不要效仿).
<p>当然，在这个文本格式中，不用vector而使用map会更有扩充性，例如，还可通过人名找电话号码等等，但是使用了map就不那么好用sort了。你可以用map试一试。
<p>这里string的作用不只是可以存储字符串，还可以提供字符串的比较，查找等。在sort和unique函数中就默认使用了less<string> 和equal_to<string>函数, 上面的一段代码，其实使用了string的以下功能：
<ol>
    <li>存储功能，在getline() 函数中
    <li>查找功能，在find() 函数中
    <li>子串功能，在substr() 函数中
    <li>string operator &lt; , 默认在sort() 函数中调用
    <li>string operator == , 默认在unique() 函数中调用 </li>
</ol>
<p>总之，有了string 后，C++的字符文本处理功能总算得到了一定补充，加上配合STL其他容器使用，其在文本处理上的功能已经与perl, shell, php的距离缩小很多了。 因此掌握string 会让你的工作事半功倍。
<p>
<h3><a name=saSR1xxCyScSY></a>1 string 使用 </h3>
其实，string并不是一个单独的容器，只是basic_string 模板类的一个typedef 而已，相对应的还有wstring, 你在string 头文件中你会发现下面的代码:
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=brown>extern</font> "<font color=blue>C++</font>" {
<font color=brown>typedef</font> basic_string &lt;<font color=brown>char</font>&gt; string;
<font color=brown>typedef</font> basic_string &lt;wchar_t&gt; wstring;
} <font color=green>// extern "C++"</font></font></pre>
</pre>
</div>
</div>
由于只是解释string的用法，如果没有特殊的说明，本文并不区分string 和 basic_string的区别。
<p>string 其实相当于一个保存字符的序列容器，因此除了有字符串的一些常用操作以外，还有包含了所有的序列容器的操作。字符串的常用操作包括：增加、删除、修改、查找比较、链接、输入、输出等。详细函数列表参看<a class="twikiCurrentTopicLink twikiAnchorLink" href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString#FuncList"><u><font color=#4571d0>附录</font></u></a>。不要害怕这么多函数，其实有许多是序列容器带有的，平时不一定用的上。
<p>如果你要想了解所有函数的详细用法，你需要查看<a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLBasicString"><u><font color=#4571d0>basic_string</font></u></a>，或者下载<a href="http://stl.winterxy.com/html/000035.html" target=_top><u><font color=#4571d0>STL编程手册</font></u></a>。这里通过实例介绍一些常用函数。
<h4><a name=sa.kSde/WsOjg></a>1.1 充分使用string 操作符 </h4>
string 重载了许多操作符，包括 +, +=, &lt;, <code><font color=#7a4707>=, </font></code>, [], &lt;&lt;, &gt;&gt;等，正式这些操作符，对字符串操作非常方便。先看看下面这个例子：tt.cpp（例程2）
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=navy>#include</font> &lt;string&gt;
<font color=navy>#include</font> &lt;iostream&gt;
<font color=brown>using</font> <font color=brown>namespace</font> std;
<font color=brown>int</font> main(){
string strinfo="<font color=blue>Please input your name:</font>";
cout &lt;&lt; strinfo ;
cin &gt;&gt; strinfo;
<font color=brown>if</font>( strinfo == "<font color=blue>winter</font>" )
cout &lt;&lt; "<font color=blue>you are winter!</font>"&lt;&lt;endl;
<font color=brown>else</font> <font color=brown>if</font>( strinfo != "<font color=blue>wende</font>" )
cout &lt;&lt; "<font color=blue>you are not wende!</font>"&lt;&lt;endl;
<font color=brown>else</font> <font color=brown>if</font>( strinfo &lt; "<font color=blue>winter</font>")
cout &lt;&lt; "<font color=blue>your name should be ahead of winter</font>"&lt;&lt;endl;
<font color=brown>else</font>
cout &lt;&lt; "<font color=blue>your name should be after of winter</font>"&lt;&lt;endl;
strinfo += "<font color=blue> , Welcome to China!</font>";
cout &lt;&lt; strinfo&lt;&lt;endl;
cout &lt;&lt;"<font color=blue>Your name is :</font>"&lt;&lt;endl;
string strtmp = "<font color=blue>How are you? </font>" + strinfo;
<font color=brown>for</font>(<font color=brown>int</font> i = 0 ; i &lt; strtmp.size(); i ++)
cout&lt;&lt;strtmp[i];
<font color=brown>return</font> 0;
} </pre>
</pre>
</div>
</div>
<p>下面是程序的输出
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px">-bash-2.05b$ make tt
c++  -O -pipe -march=pentiumpro  tt.cpp  <font color=purple>-o</font> tt
-bash-2.05b$ ./tt
Please input your name:Hero
you are not wende!
Hero , Welcome to China!
How are you? Hero , Welcome to China!</pre>
</pre>
</div>
</div>
<p>有了这些操作符，在STL中仿函数都可以直接使用string作为参数，例如 less, great, equal_to 等，因此在把string作为参数传递的时候，它的使用和int 或者float等已经没有什么区别了。例如，你可以使用：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px">map&lt;string, <font color=brown>int</font>&gt; mymap;
<font color=green>//以上默认使用了 less&lt;string&gt;</font></font></pre>
</pre>
</div>
</div>
有了 operator + 以后，你可以直接连加，例如：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px">string strinfo="<font color=blue>Winter</font>";
string strlast="<font color=blue>Hello </font>" + strinfo + "<font color=blue>!</font>";
<font color=green>//你还可以这样：</font>
string strtest="<font color=blue>Hello </font>" + strinfo + "<font color=blue> Welcome</font>" + "<font color=blue> to China</font>" + "<font color=blue> !</font>";</pre>
</pre>
</div>
</div>
看见其中的特点了吗？只要你的等式里面有一个 string 对象，你就可以一直连续"+"，但有一点需要保证的是，在开始的两项中，必须有一项是 string 对象。其原理很简单：
<ol>
    <li>系统遇到"+"号，发现有一项是string 对象。
    <li>系统把另一项转化为一个临时 string 对象。
    <li>执行 operator + 操作，返回新的临时string 对象。
    <li>如果又发现"+"号，继续第一步操作。 </li>
</ol>
由于这个等式是由左到右开始检测执行，如果开始两项都是const char* ，程序自己并没有定义两个const char* 的加法，编译的时候肯定就有问题了。
<p>有了操作符以后，assign(), append(), compare(), at()等函数，除非有一些特殊的需求时，一般是用不上。当然at()函数还有一个功能，那就是检查下标是否合法，如果是使用：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px">string str="<font color=blue>winter</font>";
<font color=green>//下面一行有可能会引起程序中断错误</font>
str[100]='!';
<font color=green>//下面会抛出异常:throws: out_of_range</font>
cout&lt;&lt;str.at(100)&lt;&lt;endl;</pre>
</pre>
</div>
</div>
了解了吗？如果你希望效率高，还是使用[]来访问，如果你希望稳定性好，最好使用at()来访问。
<h4><a name=samXfCIojLCG6></a>1.2 眼花缭乱的string find 函数 </h4>
由于查找是使用最为频繁的功能之一，string 提供了非常丰富的查找函数。其列表如下：
<table class=twikiTable id=table1 cellSpacing=0 cellPadding=0 rules=rows border=1>
    <tbody>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top align=middle bgColor=#ffffff>函数名 </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top align=middle bgColor=#ffffff>描述 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>find </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>查找 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>rfind </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>反向查找 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>find_first_of </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>查找包含子串中的任何字符，返回第一个位置 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>find_first_not_of </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>查找不包含子串中的任何字符，返回第一个位置 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>find_last_of </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>查找包含子串中的任何字符，返回最后一个位置 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol twikiLast" vAlign=top bgColor=#ffffff>find_last_not_of </td>
            <td class="twikiTableCol1 twikiLastCol twikiLast" vAlign=top bgColor=#ffffff>查找不包含子串中的任何字符，返回最后一个位置 </td>
        </tr>
    </tbody>
</table>
以上函数都是被重载了4次，以下是以find_first_of 函数为例说明他们的参数，其他函数和其参数一样，也就是说总共有24个函数 <img title=smile alt=smile src="http://www.stlchina.org/twiki/pub/TWiki/SmiliesPlugin/smile.gif" border=0> ：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px">size_type find_first_of(<font color=brown>const</font> basic_string&amp; s, size_type pos = 0)
size_type find_first_of(<font color=brown>const</font> charT* s, size_type pos, size_type n)
size_type find_first_of(<font color=brown>const</font> charT* s, size_type pos = 0)
size_type find_first_of(charT c, size_type pos = 0)</pre>
</pre>
</div>
</div>
所有的查找函数都返回一个size_type类型，这个返回值一般都是所找到字符串的位置，如果没有找到，则返回string::npos。有一点需要特别注意，所有和string::npos的比较一定要用string::size_type来使用，不要直接使用int 或者unsigned int等类型。其实string::npos表示的是-1, 看看头文件：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=brown>template</font> &lt;<font color=brown>class</font> _CharT, <font color=brown>class</font> _Traits, <font color=brown>class</font> _Alloc&gt;
<font color=brown>const</font> basic_string&lt;_CharT,_Traits,_Alloc&gt;::size_type
basic_string&lt;_CharT,_Traits,_Alloc&gt;::npos
= basic_string&lt;_CharT,_Traits,_Alloc&gt;::size_type) -1;</pre>
</pre>
</div>
</div>
<p>find 和 rfind 都还比较容易理解，一个是正向匹配，一个是逆向匹配，后面的参数pos都是用来指定起始查找位置。对于find_first_of 和find_last_of 就不是那么好理解。
<p>find_first_of 是给定一个要查找的字符集，找到这个字符集中任何一个字符所在字符串中第一个位置。或许看一个例子更容易明白。
<p>有这样一个需求：过滤一行开头和结尾的所有非英文字符。看看用string 如何实现：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=navy>#include</font> &lt;string&gt;
<font color=navy>#include</font> &lt;iostream&gt;
<font color=brown>using</font> <font color=brown>namespace</font> std;
<font color=brown>int</font> main(){
string strinfo="<font color=blue>   //*---Hello Word!......------</font>";
string strset="<font color=blue>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz</font>";
<font color=brown>int</font> first = strinfo.find_first_of(strset);
<font color=brown>if</font>(first == string::npos) {
cout&lt;&lt;"<font color=blue>not find any characters</font>"&lt;&lt;endl;
<font color=brown>return</font> -1;
}
<font color=brown>int</font> last = strinfo.find_last_of(strset);
<font color=brown>if</font>(last == string::npos) {
cout&lt;&lt;"<font color=blue>not find any characters</font>"&lt;&lt;endl;
<font color=brown>return</font> -1;
}
cout &lt;&lt; strinfo.substr(first, last - first + 1)&lt;&lt;endl;
<font color=brown>return</font> 0;
}</pre>
</pre>
</div>
</div>
这里把所有的英文字母大小写作为了需要查找的字符集，先查找第一个英文字母的位置，然后查找最后一个英文字母的位置，然后用substr 来的到中间的一部分，用于输出结果。下面就是其结果：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px">Hello Word</pre>
</pre>
</div>
</div>
前面的符号和后面的符号都没有了。像这种用法可以用来查找分隔符，从而把一个连续的字符串分割成为几部分，达到 shell 命令中的 awk 的用法。特别是当分隔符有多个的时候，可以一次指定。例如有这样的需求：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px">张三|3456123, 湖南
李四,4564234| 湖北
王小二, 4433253|北京
...</pre>
</pre>
</div>
</div>
我们需要以 "|" ","为分隔符，同时又要过滤空格，把每行分成相应的字段。可以作为你的一个家庭作业来试试，要求代码简洁。
<h4><a name=saVjopW.ELNL2></a>1.3 string insert, replace, erase </h4>
了解了string 的操作符，查找函数和substr，其实就已经了解了string的80%的操作了。insert函数, replace函数和erase函数在使用起来相对简单。下面以一个例子来说明其应用。
<p>string只是提供了按照位置和区间的replace函数，而不能用一个string字串来替换指定string中的另一个字串。这里写一个函数来实现这个功能：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=brown>void</font> string_replace(string &amp; strBig, <font color=brown>const</font> string &amp; strsrc, <font color=brown>const</font> string &amp;strdst) {
string::size_type pos=0;
string::size_type srclen=strsrc.size();
string::size_type dstlen=strdst.size();
<font color=brown>while</font>( (pos=strBig.find(strsrc, pos)) != string::npos){
strBig.replace(pos, srclen, strdst);
pos += dstlen;
}
}</pre>
</pre>
</div>
</div>
看看如何调用：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 16px"><font color=navy>#include</font> &lt;string&gt;
<font color=navy>#include</font> &lt;iostream&gt;
<font color=brown>using</font> <font color=brown>namespace</font> std;
<font color=brown>int</font> main() {
string strinfo="<font color=blue>This is Winter, Winter is a programmer. Do you know Winter?</font>";
cout&lt;&lt;"<font color=blue>Orign string is :\n</font>"&lt;&lt;strinfo&lt;&lt;endl;
string_replace(strinfo, "<font color=blue>Winter</font>", "<font color=blue>wende</font>");
cout&lt;&lt;"<font color=blue>After replace Winter with wende, the string is :\n</font>"&lt;&lt;strinfo&lt;&lt;endl;
<font color=brown>return</font> 0;
}</pre>
</pre>
</div>
</div>
其输出结果：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px">Orign string is :
This is Winter, Winter is a programmer. Do you know Winter?
After replace Winter with wende, the string is :
This is wende, wende is a programmer. Do you know wende?</pre>
</pre>
</div>
</div>
如果不用replace函数，则可以使用erase和insert来替换，也能实现string_replace函数的功能：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=brown>void</font> string_replace(string &amp; strBig, <font color=brown>const</font> string &amp; strsrc, <font color=brown>const</font> string &amp;strdst) {
string::size_type pos=0;
string::size_type srclen=strsrc.size();
string::size_type dstlen=strdst.size();
<font color=brown>while</font>( (pos=strBig.find(strsrc, pos)) != string::npos){
strBig.erase(pos, srclen);
strBig.insert(pos, strdst);
pos += dstlen;
}
}</pre>
</pre>
</div>
</div>
当然，这种方法没有使用replace来得直接。
<h3><a name=savp2ilvR/GkE></a>2 string 和 C风格字符串 </h3>
现在看了这么多例子，发现const char* 可以和string 直接转换，例如我们在上面的例子中，使用
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px">string_replace(strinfo, "<font color=blue>Winter</font>", "<font color=blue>wende</font>");</pre>
</pre>
</div>
</div>
来代用
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=brown>void</font> string_replace(string &amp; strBig, <font color=brown>const</font> string &amp; strsrc, <font color=brown>const</font> string &amp;strdst) </pre>
</pre>
</div>
</div>
在C语言中只有char* 和 const char*，为了使用起来方便，string提供了三个函数满足其要求：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=brown>const</font> charT* c_str() <font color=brown>const</font>
<font color=brown>const</font> charT* data() <font color=brown>const</font>
size_type copy(charT* buf, size_type n, size_type pos = 0) <font color=brown>const</font> </pre>
</pre>
</div>
</div>
其中：
<ol>
    <li>c_str 直接返回一个以\0结尾的字符串。
    <li>data 直接以数组方式返回string的内容，其大小为size()的返回值，结尾并没有\0字符。
    <li>copy 把string的内容拷贝到buf空间中。 </li>
</ol>
你或许会问，c_str()的功能包含data()，那还需要data()函数干什么？看看源码：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=brown>const</font> charT* c_str () <font color=brown>const</font>
{ <font color=brown>if</font> (length () == 0) <font color=brown>return</font> "<font color=blue></font>"; terminate (); <font color=brown>return</font> data (); }</pre>
</pre>
</div>
</div>
原来c_str()的流程是：先调用terminate()，然后在返回data()。因此如果你对效率要求比较高，而且你的处理又不一定需要以\0的方式结束，你最好选择data()。但是对于一般的C函数中，需要以const char*为输入参数，你就要使用c_str()函数。
<p>对于c_str() data()函数，返回的数组都是由string本身拥有，千万不可修改其内容。其原因是许多string实现的时候采用了引用机制，也就是说，有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。详细的解释和实现查看<a href="http://stl.winterxy.com/html/000030.html" target=_top><u><font color=#4571d0>Effective STL</font></u></a>的条款15：<a href="http://stl.winterxy.com/html/item_15.html" target=_top><u><font color=#4571d0>小心string实现的多样性</font></u></a>。
<p>另外在你的程序中，只在需要时才使用c_str()或者data()得到字符串，每调用一次，下次再使用就会失效，如：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px">string strinfo("<font color=blue>this is Winter</font>");
...
<font color=green>//最好的方式是:</font>
foo(strinfo.c_str());
<font color=green>//也可以这么用:</font>
<font color=brown>const</font> <font color=brown>char</font>* pstr=strinfo.c_str();
foo(pstr);
<font color=green>//不要再使用了pstr了, 下面的操作已经使pstr无效了。</font>
strinfo += "<font color=blue> Hello!</font>";
foo(pstr);<font color=green>//错误！</font></font></pre>
</pre>
</div>
</div>
会遇到什么错误？当你幸运的时候pstr可能只是指向"this is Winter Hello!"的字符串，如果不幸运，就会导致程序出现其他问题，总会有一些不可遇见的错误。总之不会是你预期的那个结果。
<p>
<h3><a name=sa6BZN3S1oWUI></a>3 string 和 Charactor Traits </h3>
了解了string的用法，该详细看看string的真相了。前面提到string 只是basic_string的一个typedef。看看basic_string 的参数：
<div class=BeautifierPlugin>
<div class=fragment>
<pre style="PADDING-BOTTOM: 0px">
<pre style="PADDING-BOTTOM: 0px"><font color=brown>template</font> &lt;<font color=brown>class</font> charT, <font color=brown>class</font> traits = char_traits&lt;charT&gt;,
<font color=brown>class</font> Allocator = allocator&lt;charT&gt; &gt;
<font color=brown>class</font> basic_string
{
<font color=green>//...</font>
}</pre>
</pre>
</div>
</div>
char_traits不仅是在basic_string 中有用，在basic_istream 和 basic_ostream中也需要用到。
<p>就像Steve Donovan在<a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLOverdoTemplates" target=_top><u><font color=#4571d0>过度使用C++模板</font></u></a>中提到的，这些确实有些过头了，要不是系统自己定义了相关的一些属性，而且用了个typedef，否则还真不知道如何使用。
<p>但复杂总有复杂道理。有了char_traits，你可以定义自己的字符串类型。当然，有了char_traits &lt; char &gt; 和char_traits &lt; wchar_t &gt; 你的需求使用已经足够了，为了更好的理解string ，咱们来看看char_traits都有哪些要求。
<p>如果你希望使用你自己定义的字符，你必须定义包含下列成员的结构：
<table class=twikiTable id=table2 cellSpacing=0 cellPadding=0 rules=rows border=1>
    <thead>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <th class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#687684><a title="Sort by this column" href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString?sortcol=0;table=2;up=0#sorted_table" rel=nofollow><font color=#ffffff><u>表达式</u></font></a> </th>
            <th class="twikiTableCol1 twikiLastCol" vAlign=top align=middle bgColor=#687684><a title="Sort by this column" href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString?sortcol=1;table=2;up=0#sorted_table" rel=nofollow><font color=#ffffff><u>描述</u></font></a> </th>
        </tr>
    </thead>
    <tbody>
        <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>char_type </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>字符类型 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>int_type </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>int 类型 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>pos_type </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>位置类型 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>off_type </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>表示位置之间距离的类型 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>state_type </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>表示状态的类型 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>assign(c1,c2) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>把字符c2赋值给c1 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>eq(c1,c2) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>判断c1,c2 是否相等 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>lt(c1,c2) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>判断c1是否小于c2 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>length(str) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>判断str的长度 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>compare(s1,s2,n) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>比较s1和s2的前n个字符 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>copy(s1,s2, n) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>把s2的前n个字符拷贝到s1中 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>move(s1,s2, n) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>把s2中的前n个字符移动到s1中 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>assign(s,n,c) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>把s中的前n个字符赋值为c </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>find(s,n,c) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>在s的前n个字符内查找c </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>eof() </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>返回end-of-file </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>to_int_type(c) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>将c转换成int_type </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>to_char_type(i) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>将i转换成char_type </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>not_eof(i) </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>判断i是否为EOF </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol twikiLast" vAlign=top bgColor=#ffffff>eq_int_type(i1,i2) </td>
            <td class="twikiTableCol1 twikiLastCol twikiLast" vAlign=top bgColor=#ffffff>判断i1和i2是否相等 </td>
        </tr>
    </tbody>
</table>
想看看实际的例子，你可以看看sgi STL的<a href="http://www.stlchina.org/stl_doc/char_traits.h" target=_top><u><font color=#4571d0>char_traits结构源码</font></u></a>.
<p>现在默认的string版本中，并不支持忽略大小写的比较函数和查找函数，如果你想练练手，你可以试试改写一个char_traits , 然后生成一个case_string类, 也可以在string 上做继承，然后派生一个新的类，例如：ext_string，提供一些常用的功能，例如：
<ol>
    <li>定义分隔符。给定分隔符，把string分为几个字段。
    <li>提供替换功能。例如，用winter, 替换字符串中的wende
    <li>大小写处理。例如，忽略大小写比较，转换等
    <li>整形转换。例如把"123"字符串转换为123数字。 </li>
</ol>
这些都是常用的功能，如果你有兴趣可以试试。其实有人已经实现了，看看<a href="http://www.gotroot.ca/ext_string/" target=_top><u><font color=#4571d0>Extended STL string</font></u></a>。如果你想偷懒，下载一个头文件就可以用，有了它确实方便了很多。要是有人能提供一个支持正则表达式的string，我会非常乐意用。
<p>
<h3><a name=sa6u8GaLNa5nc></a>4 string 建议 </h3>
使用string 的方便性就不用再说了，这里要重点强调的是string的安全性。
<ol>
    <li>string并不是万能的，如果你在一个大工程中需要频繁处理字符串，而且有可能是多线程，那么你一定要慎重(当然，在多线程下你使用任何STL容器都要慎重)。
    <li>string的实现和效率并不一定是你想象的那样，如果你对大量的字符串操作，而且特别关心其效率，那么你有两个选择，首先，你可以看看你使用的STL版本中string实现的源码；另一选择是你自己写一个只提供你需要的功能的类。
    <li>string的c_str()函数是用来得到C语言风格的字符串，其返回的指针不能修改其空间。而且在下一次使用时重新调用获得新的指针。
    <li>string的data()函数返回的字符串指针不会以'\0'结束，千万不可忽视。
    <li>尽量去使用操作符，这样可以让程序更加易懂（特别是那些脚本程序员也可以看懂） </li>
</ol>
<h3><a name=saU/QHMminhLI></a>5 小结 </h3>
难怪有人说：<br><strong>string 使用方便功能强，我们一直用它！</strong>
<p>
<h3><a name=saz/DkMf62vwA></a>6 附录 </h3>
<a name=saYGy3stn0cxU></a>string 函数列表
<table class=twikiTable id=table3 cellSpacing=0 cellPadding=0 rules=rows border=1>
    <tbody>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top align=middle bgColor=#ffffff>函数名 </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top align=middle bgColor=#ffffff>描述 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>begin </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>得到指向字符串开头的Iterator </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>end </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>得到指向字符串结尾的Iterator </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>rbegin </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>得到指向反向字符串开头的Iterator </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>rend </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>得到指向反向字符串结尾的Iterator </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>size </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>得到字符串的大小 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>length </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>和size函数功能相同 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>max_size </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>字符串可能的最大大小 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>capacity </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>在不重新分配内存的情况下，字符串可能的大小 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>empty </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>判断是否为空 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>operator[] </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>取第几个元素，相当于数组 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>c_str </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>取得C风格的const char* 字符串 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>data </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>取得字符串内容地址 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>operator= </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>赋值操作符 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>reserve </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>预留空间 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>swap </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>交换函数 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>insert </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>插入字符 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>append </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>追加字符 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>push_back </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>追加字符 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>operator+= </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>+= 操作符 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>erase </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>删除字符串 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>clear </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>清空字符容器中所有内容 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>resize </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>重新分配空间 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>assign </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>和赋值操作符一样 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>replace </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>替代 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>copy </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>字符串到空间 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>find </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>查找 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>rfind </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>反向查找 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>find_first_of </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>查找包含子串中的任何字符，返回第一个位置 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>find_first_not_of </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>查找不包含子串中的任何字符，返回第一个位置 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>find_last_of </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>查找包含子串中的任何字符，返回最后一个位置 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>find_last_not_of </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>查找不包含子串中的任何字符，返回最后一个位置 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>substr </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>得到字串 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>compare </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>比较字符串 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>operator+ </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>字符串链接 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>operator== </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>判断是否相等 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>operator!= </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>判断是否不等于 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>operator&lt; </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>判断是否小于 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#ffffff>operator&gt;&gt; </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#ffffff>从输入流中读入字符串 </td>
        </tr>
        <tr class="twikiTableEven twikiTableRowdataBgSorted1 twikiTableRowdataBg1">
            <td class="twikiTableCol0 twikiFirstCol" vAlign=top bgColor=#edf4f9>operator&lt;&lt; </td>
            <td class="twikiTableCol1 twikiLastCol" vAlign=top bgColor=#edf4f9>字符串写入输出流 </td>
        </tr>
        <tr class="twikiTableOdd twikiTableRowdataBgSorted0 twikiTableRowdataBg0">
            <td class="twikiTableCol0 twikiFirstCol twikiLast" vAlign=top bgColor=#ffffff>getline </td>
            <td class="twikiTableCol1 twikiLastCol twikiLast" vAlign=top bgColor=#ffffff>从输入流中读入一行 </td>
        </tr>
    </tbody>
</table>
<p>
<h3><a name=sa5F8ytFPy2ek></a>7 参考文章 </h3>
<ol>
    <li><a href="http://www.stlchina.org/stl_doc/char_traits.h" target=_top><u><font color=#4571d0>SGI STL: char_traits 源码</font></u></a>
    <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLBasicString" target=_top><font color=#4571d0><u>STL 编程手册: basic_string </u></font></a>
    <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLSortAlgorithms" target=_top><u><font color=#4571d0>详细解说 STL 排序(Sort)</font></u></a>
    <li><a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailHashMap" target=_top><u><font color=#4571d0>详细解说 STL hash_map系列</font></u></a>
    <li><a href="http://stl.winterxy.com/html/000016.html" target=_top><u><font color=#4571d0>Effective STL 中文版</font></u></a> </li>
</ol>
<!--
<ul>
    <li> Set MYTITLE = 详细解说STL string
    </li>
</ul>
-->
<p><strong>论坛讨论</strong> ：<a href="http://www.stlchina.org/bbs/viewthread.php?tid=505&amp;fpage=1" target=_top><u><font color=#4571d0>讨论：详细解说STL string</font></u></a> </p>
<img src ="http://www.cppblog.com/iniwf/aggbug/77146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iniwf/" target="_blank">iniwf</a> 2009-03-19 10:35 <a href="http://www.cppblog.com/iniwf/archive/2009/03/19/77146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用STL快速编写ini配置文件识别类</title><link>http://www.cppblog.com/iniwf/archive/2009/03/19/77115.html</link><dc:creator>iniwf</dc:creator><author>iniwf</author><pubDate>Thu, 19 Mar 2009 01:37:00 GMT</pubDate><guid>http://www.cppblog.com/iniwf/archive/2009/03/19/77115.html</guid><wfw:comment>http://www.cppblog.com/iniwf/comments/77115.html</wfw:comment><comments>http://www.cppblog.com/iniwf/archive/2009/03/19/77115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/iniwf/comments/commentRss/77115.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iniwf/services/trackbacks/77115.html</trackback:ping><description><![CDATA[转自<a href="http://stl.winterxy.com/html/000021.html">http://stl.winterxy.com/html/000021.html</a><br><br>
<h3 class=title>用STL快速编写ini配置文件识别类</h3>
<p>作者：<a href="http://www.winterxy.com/blog/000029.html" target=_blank><u><font color=#0066cc> winter</font></u></a> </p>
作者Winter
<p><span lang=zh-cn>ini文件是技术人员经常用到的一种系统配置方法，如何读取和快速识别ini文件中的内容实现起来比较繁琐。STL强大的功能在于能快速的实现排序、查找、 识别等功能。本文通过STL中的map，string，vector,ifstream等，来快速实现ini文件的识别类class IniFile。IniFile可以实现常见查找功能，并提供完整的源码。</span></p>
<a name=more></a>
<p><span lang=zh-cn><u><strong>设计需求</strong></u>：</span></p>
<p><span lang=zh-cn>ini文件的格式一般如下:</span></p>
<p><font face=Fixedsys><span lang=zh-cn>[section1]<br>key1=value1<br>key2=value2<br>......</span></font></p>
<p><font face=Fixedsys><span lang=zh-cn>[section2]<br>key1=value1<br>key2=value2&nbsp;&nbsp;&nbsp; #注释<br>......</span></font></p>
<p><span lang=zh-cn>实际的例子是：</span></p>
<p><font face=Fixedsys>#ini for path<br>[path]<br>dictfile = /home/tmp/dict.dat<br>inputfile= /home/tmp/input.txt<br>outputfile= /home/tmp/output.txt</font></p>
<p><font face=Fixedsys>#ini for exe<br>[exe]<br>user= winter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //user name<br>passwd= 1234567&nbsp;&nbsp;&nbsp; #pass word<br>database= mydatabase</font></p>
<p><span lang=zh-cn>其中有五种元素：section 名，Key名，value值，注释 #或者//开头,标志字符"[" "]" "="。查找项的对应关系为sectiong-key和value对应。需要得到是value。class IniFile要实现的是两个函数：读入ini文件，读取sect-key对应的value值。即实现下面的接口：</span></p>
<p><font face=Fixedsys><font face=Fixedsys color=#0000ff>class</font> <font color=#0000ff>IniFile</font>{<br><font face=Fixedsys color=#0000ff>public</font>:<br>&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff>IniFile</font>();<br>&nbsp; <font color=#800000>&nbsp;</font><font color=#00ff00> </font><font color=#008000>//打开ini文件</font><br>&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff>bool</font> open(<font face=Fixedsys color=#0000ff>const</font> <font face=Fixedsys color=#0000ff>char</font>* pinipath);<br>&nbsp; <font color=#008000>&nbsp; //读取value值</font><br>&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff>const</font> <font face=Fixedsys color=#0000ff>char</font>* read(<font face=Fixedsys color=#0000ff>const</font> <font face=Fixedsys color=#0000ff>char</font>* psect, <font face=Fixedsys color=#0000ff>const</font> <font face=Fixedsys color=#0000ff>char</font>*pkey);<br>&nbsp; };</font></p>
<p><u><strong><span lang=zh-cn>设计实现：</span></strong></u></p>
<p><span lang=zh-cn>用ifstream按行读入ini文件的内容<br>识别每一行的字符串，分析出sectiong，key，value，和注释。<br>用map&lt;string, string, less&lt;string&gt; &gt;来记录所有的sectiong－key和value。</span></p>
<p><span lang=zh-cn>重新定义class IniFile</span></p>
<p><font face=Fixedsys><font face=Fixedsys color=#0000ff>typedef</font> <font face=Fixedsys color=#0000ff>map</font>&lt;<font face=Fixedsys color=#0000ff>string</font>, <font face=Fixedsys color=#0000ff>string</font>, <font face=Fixedsys color=#0000ff>less</font>&lt;<font face=Fixedsys color=#0000ff>string</font>&gt; &gt; <font face=Fixedsys color=#0000ff>strMap</font>;<br><font face=Fixedsys color=#0000ff>typedef</font> <font face=Fixedsys color=#0000ff>strMap</font>::<font face=Fixedsys color=#0000ff>iterator</font> <font face=Fixedsys color=#0000ff>strMapIt</font>;<br><br><font face=Fixedsys color=#0000ff>const</font> <font face=Fixedsys color=#0000ff>char</font>*<font face=Fixedsys color=#0000ff>const</font> MIDDLESTRING = "_____***_______";<br><font face=Fixedsys color=#0000ff>class</font> <font face=Fixedsys color=#0000ff>IniFile</font><br>{<br><font face=Fixedsys color=#0000ff>public</font>:<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>IniFile</font>( ){};<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>~IniFile</font>( ){};<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>bool</font> open(const char* pinipath)<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>{<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><font color=#0000ff>return</font> do_open(pinipath);<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>}<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>string</font> read(<font face=Fixedsys color=#0000ff>const</font> <font face=Fixedsys color=#0000ff>char</font>*psect, <font face=Fixedsys color=#0000ff>const</font> char*pkey)<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>{<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff>string</font> mapkey = psect;<br>&nbsp; <span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>&nbsp; mapkey += MIDDLESTRING;<br>&nbsp;&nbsp; <span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>&nbsp;mapkey += pkey;<br>&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>strMapIt</font> it<font color=#0000ff> </font>= c_inimap.find(mapkey);<br>&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>if</font>(it == c_inimap.end())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>return</font> "";<br>&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>else</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>return</font> it-&gt;second;<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>}<br><font face=Fixedsys color=#0000ff>protected</font>:<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>bool</font> do_open(<font face=Fixedsys color=#0000ff>const</font> <font face=Fixedsys color=#0000ff>char</font>* pinipath)<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>{<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ifstream</font> fin(pinipath);<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if</font>(!fin.is_open())<font color=#0000ff><br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font face=Fixedsys color=#0000ff>return</font> false;<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vector</font>&lt;<font face=Fixedsys color=#0000ff>string</font>&gt; strvect;<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>while</font>(!fin.eof())<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string</font> inbuf;<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>getline(fin, inbuf,'\n');<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>strvect.push_back(inbuf);<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br><font color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if</font>(strvect.empty())<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return</font> false;<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for_each(strvect.begin(), strvect.end(), analyzeini(c_inimap));<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return</font> !c_inimap.empty(); <br><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>}<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>strMap</font> c_inimap;<br>};</font></p>
<p><span lang=zh-cn>其中do_open是用来真正实现初始化ini内容的函数。先用ifstream fin打开一个文件，然后用is_open判断文件是否正常打开。顺序读取文件的时候用eof()判断是否到文件尾。getline是一个字符处理函数：直接从fin中读取一行。然后用while循环过滤一行末尾的空格等字符。最后保存到一个vector中，完成读入文本工作。其中比较值得关注的是以下为体，你知道为什么这么做么？</span></p>
<ul>
    <li><span lang=zh-cn>用ifstream和getline来读入而不是用fopen和fread。</span>
    <li><span lang=zh-cn>用is_open判断是否打开，而不是直接读取。</span>
    <li><span lang=zh-cn>用vector的push_pack而不是insert。</span>
    <li><span lang=zh-cn>用empty判断是否为空，而不是用size()==0。</span> </li>
</ul>
<p><span lang=zh-cn>下一步用for_each函数来完成字符串的内容提取工作。声明一个结构，实现对操作符()的重载。代码如下：</span></p>
<p><font face=Fixedsys><font face=Fixedsys color=#0000ff>truct</font> <font face=Fixedsys color=#0000ff>analyzeini</font>{<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>string</font> strsect;<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>strMap</font> *pmap;<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>analyzeini</font>(<font face=Fixedsys color=#0000ff>strMap</font> &amp; strmap):pmap(&amp;strmap){} <br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>void</font> operator()( <font face=Fixedsys color=#0000ff>const</font> <font face=Fixedsys color=#0000ff>string</font> &amp; strini)<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>{<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp; int</font> first =strini.find('[');<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int</font> last = strini.rfind(']');<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if</font>( first != <font face=Fixedsys color=#0000ff>string</font>::npos &amp;&amp; last != <font face=Fixedsys color=#0000ff>string</font>::npos &amp;&amp; first != last+1)<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>strsect = strini.substr(first+1,last-first-1);<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return</font> ;<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if</font>(strsect.empty())<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return</font> ;<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if</font>((first=strini.find('='))== <font face=Fixedsys color=#0000ff>string</font>::npos)<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return</font> ;<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string</font> strtmp1= strini.substr(0,first);<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string</font> strtmp2=strini.substr(first+1, <font face=Fixedsys color=#0000ff>string</font>::npos);<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>first= strtmp1.find_first_not_of(" \t");<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>last = strtmp1.find_last_not_of(" \t");<br><font color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(</font>first == <font face=Fixedsys color=#0000ff>string</font>::npos || last == <font face=Fixedsys color=#0000ff>string</font>::npos)<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return</font> ;<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string</font> strkey = strtmp1.substr(first, last-first+1);<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>first = strtmp2.find_first_not_of(" \t");<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if</font>(((last = strtmp2.find("\t#", first )) != <font face=Fixedsys color=#0000ff>string</font>::npos) ||<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>((last = strtmp2.find(" #", first )) != <font face=Fixedsys color=#0000ff>string</font>::npos) ||<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>((last = strtmp2.find("\t//", first )) != <font face=Fixedsys color=#0000ff>string</font>::npos)||<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>((last = strtmp2.find(" //", first )) != <font face=Fixedsys color=#0000ff>string</font>::npos))<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>strtmp2 = strtmp2.substr(0, last-first);<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>last = strtmp2.find_last_not_of(" \t");<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if</font>(first == <font face=Fixedsys color=#0000ff>string</font>::npos || last == <font face=Fixedsys color=#0000ff>string</font>::npos)<br><font color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return</font> ;<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string</font> value = strtmp2.substr(first, last-first+1);<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string</font> mapkey = strsect + MIDDLESTRING;<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mapkey += strkey;<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(*pmap)[mapkey]=value;<br><font face=Fixedsys color=#0000ff><span lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return</font> ;<br><span lang=zh-cn>&nbsp;&nbsp;&nbsp; </span>}<br>};</font></p>
<p><span lang=zh-cn>这里大量使用了字符串的查找和字串功能。string的find_last_of系列和find系列，功能确实十分强大。所有在string中没有找到都会返回一个变量string::npos。</span></p>
<p><span lang=zh-cn>函数先找sectiong，然后分离key值和value值。符合要求的，把section和key值通过中间加上MIDDLESTRING组成一个新的string，插入map中。这里值得注意的是：</span></p>
<ul>
    <li><span lang=zh-cn>for_each的使用，结构可以传递参数。</span>
    <li><span lang=zh-cn>string的查找函数及返回值</span>
    <li><span lang=zh-cn>string的链接和合并函数。</span>
    <li><span lang=zh-cn>map的下标操作符的使用。</span> </li>
</ul>
<p><u><strong><span lang=zh-cn>具体使用</span></strong></u></p>
<p><span lang=zh-cn>把所有代码放在一个头文件中，以后别人使用的时候，只需要包含头文件就可以了，点击<a href="http://stl.winterxy.com/html/inifile.h"><u><font color=#800080>查看inifile.h文件</font></u></a>。在使用的过程中，注意判断返回值。使用代码如下：</span></p>
<p><font face=Fixedsys><font color=#0000ff>#include</font> &lt;<font face=Fixedsys color=#0000ff>iostream</font>&gt;<br><font color=#0000ff>#</font><font face=Fixedsys color=#0000ff>include</font> "inifile.h"<br><font face=Fixedsys color=#0000ff>using</font> <font color=#0000ff>namespace</font> <font face=Fixedsys color=#0000ff>std</font>;<br><font face=Fixedsys color=#0000ff>int</font> main()<br>{<br>&nbsp;&nbsp;&nbsp; IniFile ini;<br>&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff>if</font>(!ini.open("test.ini"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff>return</font> -1;<br>&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff>string</font> strvalue = ini.read("sect1","key1");<br>&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff>if</font>(strvalue.empty())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff>return</font> -1;<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"value="&lt;&lt;strvalue&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; <font face=Fixedsys color=#0000ff>return</font> 0;<br>}&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><span lang=zh-cn><br>　</span></p>
<p><span lang=zh-cn>&nbsp; </span></p>
相关文章： <a href="http://stl.winterxy.com/html/000017.html" target=_blank><font color=#0066cc><u>Effective STL 中文版(大全)</u></font></a><br><a href="http://stl.winterxy.com/html/000026.html" target=_blank><u><font color=#0066cc>Effective STL 条款31：理解你的排序操作</font></u></a><br>| <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=21"><u><font color=#0066cc>引用</font></u></a> <br></span>
<img src ="http://www.cppblog.com/iniwf/aggbug/77115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iniwf/" target="_blank">iniwf</a> 2009-03-19 09:37 <a href="http://www.cppblog.com/iniwf/archive/2009/03/19/77115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最优秀的STL使用学习网站</title><link>http://www.cppblog.com/iniwf/archive/2009/03/16/76769.html</link><dc:creator>iniwf</dc:creator><author>iniwf</author><pubDate>Mon, 16 Mar 2009 13:25:00 GMT</pubDate><guid>http://www.cppblog.com/iniwf/archive/2009/03/16/76769.html</guid><wfw:comment>http://www.cppblog.com/iniwf/comments/76769.html</wfw:comment><comments>http://www.cppblog.com/iniwf/archive/2009/03/16/76769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/iniwf/comments/commentRss/76769.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iniwf/services/trackbacks/76769.html</trackback:ping><description><![CDATA[<div id=banner>
<h1><a accessKey=1 href="http://stl.winterxy.com/">Center of STL Study</a> </h1>
<span>——最优秀的STL使用学习网站 <a href="http://stl.winterxy.com/">http://stl.winterxy.com/</a><SCRIPT language=javascript src="http://www.winterxy.com/cgi-bin/js/webstats.js"></SCRIPT></span></div>
<div id=content>
<div><!--
-->
<h2>November 14, 2005 </h2>
<div><a name=000136></a>
<h3><a href="http://stl.winterxy.com/html/000136.html">C++ Connections 在拉斯维加斯召开年会</a></h3>
<p><img src="http://static.flickr.com/26/57410826_cf4f30b6b5.jpg?v=0" align=right><br>
<p>没想到C++ connections conference 在Las Vegas的Mandalay Bay酒店召开，那可是豪华赌场＋豪华酒店啊，上次去Las Vegas的时候还留了好多<a href="http://www.flickr.com/photos/winter_lb/sets/1243148/">拉斯维加斯照片</a>
<p>得到一份conference的CD，这里共享出来。里面有Scott Meyers(Effective C++/Effective STL的作者), Matt Austern(Generic Programming and the STL 的作者), Bjarne Stroustrup(C++之父)的演讲。不容错过。
<p>令我出乎意料的是，这次会议大部分内容都是在介绍C++的标准库以及C++范型编程，以往很火的OOP内容已经少之又少。如果你看不懂这种风格的代码：
<pre>tr1::function &lt; void(const record_set&amp;) &gt;  on_completion =
tr1::bind(tr1::mem_fn(&amp;grid::display_data), this, _1);
</pre>
<br>你有可能快落伍了。
<p>看看这些链接吧：<br><a href="http://www.stlchina.org/download/cpp/">C++ Connectiions Conference CD </a><br><a href="http://www.devconnections.com/shows/cppfall2005/default.asp?s=67">C++ Connection Home Page</a>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000136.html">09:37</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=136">回复 (1009)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=136">引用 (281)</a> </div>
</div>
<!--
-->
<h2>October 31, 2005 </h2>
<div><a name=000132></a>
<h3><a href="http://stl.winterxy.com/html/000132.html">STL China 上新增两个主题</a></h3>
<p>STLChina.org上新增两个栏目:<br>1 <a href="http://www.stlchina.org/twiki/bin/view.pl/STLEnglish/WebHome">STL 英文技术文章</a>。提供丰富的STL技术文章的英文原文 <br>2 <a href="http://www.stlchina.org/twiki/bin/view.pl/STL/ResouceDownload">STL 资料下载中心</a> Winter收集了一些电子书，你可以任意下载。不过目前还在完善之中。你有好的电子书，也可以提供给Winter，然后share给大家。
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000132.html">01:45</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=132">回复 (1081)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=132">引用 (266)</a> </div>
</div>
<!--
-->
<h2>September 23, 2005 </h2>
<div><a name=000119></a>
<h3><a href="http://stl.winterxy.com/html/000119.html">详细解说STL hash_map系列</a></h3>
<p>STL 封装了许多复杂的数据结构，最典型的就是二叉树。因此，map得到许多应用，但有许多人并不知道还有hash_map， 或者hash_set 等。在某些时候，这些非标准的容器，说不定会帮你解决很多问题。</p>
<p>本文详细介绍了hash_map的使用以及和map的区别，对于初学者和希望深入研究STL的朋友都有所帮助，也是《详细解说STL系列》中很重要一部分。</p>
<p>以下是目录:<br>0 为什么需要hash_map <br>1 数据结构：hash_map原理 <br>2 hash_map 使用 <br>2.1 一个简单实例 <br>2.2 hash_map 的hash函数<br>2.3 hash_map 的比较函数 <br>2.4 hash_map 函数 <br>3 相关hash容器 <br>4 其他 <br>4.1 hash_map和map的区别在哪里？ <br>4.2 什么时候需要用hash_map，什么时候需要用map? <br>4.3 如何在hash_map中加入自己定义的类型? <br>4.4如何用hash_map替换程序中已有的map容器？ <br>4.5为什么hash_map不是标准的？ <br>4.6 有学习使用hash_map的建议吗？ <br>5 参考文章: <br>详细查看:<a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailHashMap"> 详细解说STL hash_map系列</a>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000119.html">01:08</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=119">回复 (729)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=119">引用 (566)</a> </div>
</div>
<!--
"
dc:creator="winter"
dc:date="2005-08-18T23:43:39+08:00" />
-->
<h2>August 18, 2005 </h2>
<div><a name=000113></a>
<h3><a href="http://stl.winterxy.com/html/000113.html">bind2st for_each 和 transform</a></h3>
<p>今天<a href="http://www.stlchina.org/bbs/" target=_blank>STL论坛上</a>有个朋友问关于<a href="http://www.stlchina.org/bbs/viewthread.php?tid=562&amp;fpage=1" target=_blank>bind2st使用的问题</a>，开始以为很简单： <br><br>void print(int&amp; a,const int b)<br>{<br>a+=b;<br>}<br><br>int main()<br>{ <br>list&lt;int&gt; my_list;<br>.........<br>for_each(my_list.begin(),my_list.end(), bind2nd(print,3) );<br>}<br>目的是依次循环，每个节点加3<br>想通过bind2nd使函数的第二个值绑定为3<br>可是通过不了，这是错在哪<br>如果要达到目的的话，应该怎么改呢？？<br>
<p>后来一调试，发现不是那么容易。你能发现问题在哪儿吗？</p>
<span><a href="http://stl.winterxy.com/html/000113.html">详细阅读 "bind2st for_each 和 transform"</a></span><br>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000113.html">23:43</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=113">回复 (1192)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=113">引用 (298)</a> </div>
</div>
<!--
-->
<h2>July 20, 2005 </h2>
<div><a name=000109></a>
<h3><a href="http://stl.winterxy.com/html/000109.html">过度使用C++模板</a></h3>
<p>本文来自<a href="http://www.stlchina.org/" target=_blank>STL中文站</a>
<p>大约每隔十年，都会出现一个编程新概念，宣布自己是以往概念的继承者。我们也再一次相信，从今往后软件比以前更可靠，更容易build，或者更有意思(没有人相信它会比以前更小或者更快)。在70年代，有结构编程；在80年代，开始了面向对象编程；从90年代中期，出现了范型编程(generic programming)。范型编程得名于其用模板而使代码重用的高效技术(范型类和范型函数)。
<p>模板类和模板函数都是非常有用的工具。例如sqr()函数可以计算平方数，任何定义了乘法运算的数据类型（数字，矩阵）都适用。标准容器类(如 list)都是模板，这样对于每个新类型无需重写了，这正是使用旧版的C++时真正头疼的事情，因此我认为ISO的标准是个伟大的进步。然而，在这个过程中有些东西用得过头了。
<p>详细查看:<a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLOverdoTemplates" target=_blank>过度使用C++模板</a></p>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000109.html">23:56</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=109">回复 (1103)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=109">引用 (724)</a> </div>
</div>
<!--
-->
<h2>July 13, 2005 </h2>
<div><a name=000107></a>
<h3><a href="http://stl.winterxy.com/html/000107.html">详细解说STL string</a></h3>
<p>C++ 语言是个十分优秀的语言，但优秀并不表示完美。还是有许多人不愿意使用C或者C++，为什么？原因众多，其中之一就是C/C++的文本处理功能太麻烦，用起来很不方便。以前没有接触过其他语言时，每当别人这么说，我总是不屑一顾，认为他们根本就没有领会C++的精华，或者不太懂C++，现在我接触 perl, php, 和Shell脚本以后，开始理解了以前为什么有人说C++文本处理不方便了。 </p>
本文讲述了string在STL中的作用，详细介绍了STL string的用法，并讲解如何定义char_traits结构，最后提出了关于使用STL string的建议以及string类的所有函数列表。
<p>详细查看:<a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString" target=_blank> 详细解说STL string</a> </p>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000107.html">00:20</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=107">回复 (806)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=107">引用 (423)</a> </div>
</div>
<!--
-->
<h2>July 02, 2005 </h2>
<div><a name=000104></a>
<h3><a href="http://stl.winterxy.com/html/000104.html">详细解说 STL 排序(Sort)</a></h3>
<p>本文来自<a href="http://www.stlchina.org/" target=_blank>STL中文站</a><br>对于程序员来说，数据结构是必修的一门课。从查找到排序，从链表到二叉树，几乎所有的算法和原理都需要理解，理解不了也要死记硬背下来。幸运的是这些理论都已经比较成熟，算法也基本固定下来，不需要你再去花费心思去考虑其算法原理，也不用再去验证其准确性。不过，等你开始应用计算机语言来工作的时候，你会发现，面对不同的需求你需要一次又一次去用代码重复实现这些已经成熟的算法，而且会一次又一次陷入一些由于自己疏忽而产生的bug中。这时，你想找一种工具，已经帮你实现这些功能，你想怎么用就怎么用，同时不影响性能。你需要的就是STL, 标准模板库！
<p>西方有句谚语：不要重复发明轮子！
<p>STL几乎封装了所有的数据结构中的算法，从链表到队列，从向量到堆栈，对hash到二叉树，从搜索到排序，从增加到删除......可以说，如果你理解了STL，你会发现你已不用拘泥于算法本身，从而站在巨人的肩膀上去考虑更高级的应用。
<p>详细查看<a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLSortAlgorithms" target=_blank> 详细解说 STL 排序(Sort) <a></p>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000104.html">18:30</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=104">回复 (817)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=104">引用 (274)</a> </div>
</div>
<!--
-->
<div><a name=000103></a>
<h3><a href="http://stl.winterxy.com/html/000103.html">祝贺STLChina STL中文站开通</a></h3>
<p>经过一个多月的忙碌，今天终于让<a href="http://stlchina.org/twiki/bin/view.pl">STLChina --STL中文站</a>开通了。之所以要建设这个网站，很大一部分原因在于在winterxy.com这个域名实在和Winter看起来太像了，本来只是想搞一个小的blog，后来发现有很多朋友支持，特别是<a href="http://www.stlchina.org/bbs">STL论坛</a>开通以后, 觉得自己能够为大家提供一个交流沟通的平台而感到高兴。
<p>许多人做事情开始的时候热情很高，慢慢会淡漠，可能我也不例外。开始从Blog的安装，到<a href="http://www.stlchina.org/twiki/bin/view.pl/Main/InstallWiki">TWiki安装</a>，以及<a href="http://www.stlchina.org/twiki/bin/view.pl/TWiki/TextFormattingRules">TWiki语法</a>熟悉，以及BBS的问题，不过现在都差不多了，框架都已经搭好，我知道，更重要的是内容，如果能有丰富而且有用的内容，会有更多的人参与。我会希望更多的朋友一起参与，而且我也会坚持下去。希望大家继续支持，也希望和大家一起进步！
<p>祝贺STL中文站正式开通！ </p>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000103.html">00:25</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=103">回复 (955)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=103">引用 (520)</a> </div>
</div>
<!--
-->
<h2>June 09, 2005 </h2>
<div><a name=000095></a>
<h3><a href="http://stl.winterxy.com/html/000095.html">共同翻译STL (STL wiki)</a></h3>
最近在组织几个朋友一起翻译<stl 编程手册>. 翻译并不是一件容易的事情，虽然英文看懂了，但是不一定能翻译的合适。幸好并不是让我们出书，有点错误也没有关系。有兴趣的可以参看在论坛中的讨论：http://stlbbs.winterxy.com
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000095.html">22:50</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=95">回复 (1179)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=95">引用 (593)</a> </div>
</div>
<!--
-->
<h2>April 27, 2005 </h2>
<div><a name=000089></a>
<h3><a href="http://stl.winterxy.com/html/000089.html">Effective STL 中文版电子书下载</a></h3>
<p>非常感谢 抚琴舞剑(fingster@cs.hit.edu.cn)提供pdf电子书。做得非常精致，大家可以点击下载.
<p><a href="http://stl.winterxy.com/download/Eff_STL_CN.pdf">Effective STL 中文版电子书</a> </p>
<span><a href="http://stl.winterxy.com/html/000089.html">详细阅读 "Effective STL 中文版电子书下载"</a></span><br>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000089.html">13:59</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=89">回复 (1066)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=89">引用 (263)</a> </div>
</div>
<!--
-->
<h2>April 21, 2005 </h2>
<div><a name=000085></a>
<h3><a href="http://stl.winterxy.com/html/000085.html">提供c/c++ reference （STL参考）chm格式文件下载</a></h3>
<p>非常感谢Binny提供的cppreference.chm文件，此文件包含了以下部分内容：<br>1 General C/C++ <br>2 C++ <br>3 Standard C Library<br>4 C++ Standard Template Library<br></p>
<span><a href="http://stl.winterxy.com/html/000085.html">详细阅读 "提供c/c++ reference （STL参考）chm格式文件下载"</a></span><br>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000085.html">13:30</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=85">回复 (1086)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=85">引用 (543)</a> </div>
</div>
<!--
-->
<h2>April 20, 2005 </h2>
<div><a name=000084></a>
<h3><a href="http://stl.winterxy.com/html/000084.html">一个比较新的c++ STL参考网站</a></h3>
<p>今天发现一个比较新的C++ STL 参考网站，我简要看了看，有不少例子，值得参考，如果哪位有兴趣可以下载链接后制作成chm格式就更好了, 做好了别忘了送我一份，谢了先:)
<p>网站链接<a href="http://www.cppreference.com/" target=_blank> C/C++ Reference</a><br>Binny已经提供了chm格式，非常感谢。参见<a href="http://stl.winterxy.com/html/000085.html" target=_blank> 提供c/c++ reference （STL参考）chm格式文件下载</a> </p>
<p>下面是一个讲<a href="http://www.cppreference.com/cppvector/container_constructors2.html" target=_blank>Vector constructors的例子</a></p>
<span><a href="http://stl.winterxy.com/html/000084.html">详细阅读 "一个比较新的c++ STL参考网站"</a></span><br>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000084.html">15:10</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=84">回复 (1196)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=84">引用 (518)</a> </div>
</div>
<!--
"
dc:creator="winter"
dc:date="2005-04-05T00:30:18+08:00" />
-->
<h2>April 05, 2005 </h2>
<div><a name=000081></a>
<h3><a href="http://stl.winterxy.com/html/000081.html">用STL string和标准库fstream实现多个文件比较</a></h3>
<p>今天因为工作需要，<span>花了半个多小时</span>用STL中的string和标准库的fstream写了一个文件比较的小工具. 比<a href="http://stl.winterxy.com/html/000042.html" target=_blank>用标准模板库STL实现文件比较</a><span>那篇文章要简单得多，而且功能很强大。</span>这里作个例子，供大家参考<span>:)</span></p>
<p>　</p>
<p><span>功能描述：</span></p>
<ol>
    <li>
    <p><span>任意多个文件(&lt;255)，按行比较。</span> </p>
    <li>
    <p><span>&nbsp;若所有文件同一行相同，输入到一个公共的文件；</span> </p>
    <li>
    <p><span>&nbsp;把每个文件得不同行输出到不同的文件；</span> </p>
    <li>
    <p><span>&nbsp;过滤每行开头和结尾的空格和制表符'\t'。</span> </p>
    </li>
</ol>
<span><a href="http://stl.winterxy.com/html/000081.html">详细阅读 "用STL string和标准库fstream实现多个文件比较"</a></span><br>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000081.html">00:30</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=81">回复 (899)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=81">引用 (562)</a> </div>
</div>
<!--
-->
<h2>April 03, 2005 </h2>
<div><a name=000079></a>
<h3><a href="http://stl.winterxy.com/html/000079.html">最新开通STL交流论坛</a></h3>
<p>非常感谢许多朋友的支持，最新开通STL交流论坛，以后大家可以在论坛中直接交流，论坛目前有<a href="http://www.winterxy.com/cgi-bin/bbs/" target=_blank>STL新手上路</a>和<a href="http://www.winterxy.com/cgi-bin/bbs/" target=_blank>STL学习交流</a>，以后会有更多的栏目，欢迎大家灌水:).</p>
<p>由于我的MSN和QQ不会一直在线，因此许多朋友问我的问题以后可以直接在论坛中交流，我会尽快解答，另外也希望热心的大虾们<strong>申请成为斑竹</strong>，一起来营造最好的STL学习交流论坛。</p>
<p>论坛地址：<a href="http://www.winterxy.com/cgi-bin/bbs/" target=_blank>STL交流论坛</a></p>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000079.html">23:18</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=79">回复 (3816)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=79">引用 (526)</a> </div>
</div>
<!--
-->
<h2>March 30, 2005 </h2>
<div><a name=000078></a>
<h3><a href="http://stl.winterxy.com/html/000078.html">STL中仿函数(functors)、类成员和mem_fun的使用</a></h3>
<p>众所周知，STL使用起来非常方便，其中仿函数(functor)扮演了一个非常重要的角色。灵活运用仿函数的使用对于发挥STL强大功能非常关键。本文详细介绍了如何使用mem_fun和mem_fun1来绑定类成员函数，使之成为functor</p>
<span><a href="http://stl.winterxy.com/html/000078.html">详细阅读 "STL中仿函数(functors)、类成员和mem_fun的使用"</a></span><br>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000078.html">00:36</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=78">回复 (1055)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=78">引用 (318)</a> </div>
</div>
<!--
-->
<h2>March 18, 2005 </h2>
<div><a name=000073></a>
<h3><a href="http://stl.winterxy.com/html/000073.html">哪些是经典STL书籍？看看老外怎么说。</a></h3>
<p>前面几本都有中文版本,看来确实属于经典。</p>
<span><a href="http://stl.winterxy.com/html/000073.html">详细阅读 "哪些是经典STL书籍？看看老外怎么说。"</a></span><br>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000073.html">23:59</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=73">回复 (1121)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=73">引用 (795)</a> </div>
</div>
<!--
-->
<h2>March 16, 2005 </h2>
<div><a name=000072></a>
<h3><a href="http://stl.winterxy.com/html/000072.html">VC6下使用STL注意:不要让内存分配失败导致您的旧版 STL 应用程序崩溃</a></h3>
<p>本文来源于<a href="http://www.microsoft.com/china/msdn/" target=_blank>MSDN中文站</a>
<p>大多数 C++ 开发人员在他们的代码中都广泛使用了标准模块库 (STL)。如果您是其中的一员，并且正在直接使用即装即用的 STL 和 Visual C++ 6.0，则在内存不足的条件下，您的应用程序就处于崩溃的高度危险的状况下。产生此问题的原因是，检查运算符 new 是否失败是一种非常少见的做法。更糟糕的是，当 new 确实失败时，响应不是标准的。有些语言编译器返回 NULL，而其他语言则引发异常。</p>
<span><a href="http://stl.winterxy.com/html/000072.html">详细阅读 "VC6下使用STL注意:不要让内存分配失败导致您的旧版 STL 应用程序崩溃"</a></span><br>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000072.html">22:39</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=72">回复 (992)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=72">引用 (270)</a> </div>
</div>
<!--
-->
<h2>March 13, 2005 </h2>
<div><a name=000071></a>
<h3><a href="http://stl.winterxy.com/html/000071.html">C++ STL(标准模板库) 学习资源列表</a></h3>
<p>STL以其独特的魅力得到越来越多的程序员钟爱，STL彻底封装复杂的数据结构，提供丰富灵活的程序接口，同时还能保证程序的运行效率。上次整理的<a href="http://stl.winterxy.com/html/000033.html">STL技术文章列表</a>得到许多朋友的捧场，这里整理更全面的STL学习资源列表，希望对朋友们有所帮助。</p>
<span><a href="http://stl.winterxy.com/html/000071.html">详细阅读 "C++ STL(标准模板库) 学习资源列表"</a></span><br>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000071.html">16:55</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=71">回复 (1017)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=71">引用 (263)</a> </div>
</div>
<!--
-->
<h2>March 04, 2005 </h2>
<div><a name=000068></a>
<h3><a href="http://stl.winterxy.com/html/000068.html">使用STL流(stream)来简化C++&#8220;线程安全&#8221;日志记录</a></h3>
<p>本文由<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#114;&#97;&#110;&#115;&#98;&#111;&#116;&#64;&#50;&#49;&#99;&#110;&#46;&#99;&#111;&#109;">周靖</a>翻译 <br>流是一种强大的数据处理抽象机制，它允许你调用泛型的读/写函数，不必关心数据从什么地方来、到什么地方去。使用流，同样的代码可从控制台、文件、套接字等地方读取数据。STL通常不是线程安全的，本文提出了如何在线程安全的方式下使用流的方案。</p>
<span><a href="http://stl.winterxy.com/html/000068.html">详细阅读 "使用STL流(stream)来简化C++&#8220;线程安全&#8221;日志记录"</a></span><br>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000068.html">23:43</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=68">回复 (1045)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=68">引用 (528)</a> </div>
</div>
<!--
-->
<div><a name=000067></a>
<h3><a href="http://stl.winterxy.com/html/000067.html">C++ STL中用vector 改进内存的再分配</a></h3>
<p>本文说明了vector 容器使用时应该注意的内存分配问题，原理说的比较详细，对于初学者比较适用。
<p>本文描述的是一种很常见的情况：当你在某个缓存中存储数据时，常常需要在运行时调整该缓存的大小，以便能容纳更多的数据。本文将讨论如何使用 STL 的 vector 进行内存的再分配。<br><span><a href="http://stl.winterxy.com/html/000067.html">详细阅读 "C++ STL中用vector 改进内存的再分配"</a></span><br>
<div>由 winter 发表于 <a href="http://stl.winterxy.com/html/000067.html">22:48</a> | <a onclick="OpenComments(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-comments.cgi?entry_id=67">回复 (1023)</a> | <a onclick="OpenTrackback(this.href); return false" href="http://www.winterxy.com/cgi-bin/MT2/mt-tb.cgi?__mode=view&amp;entry_id=67">引用 (540)</a> </div>
</div>
</div>
</div>
<div id=links>
<div>
<p><strong><font face=Arial color=#000080>博客公告：</font></strong>：<a href="http://www.stlchina.org/bbs/" target=_blank>STL学习使用交流论坛正式运行，欢迎大家灌水:)</a><br><a href="http://www.stlchina.org/" target=_blank>热烈祝贺STL中文站正式开通！</a></p>
<form action=http://www.winterxy.com/cgi-bin/MT2/mt-search.cgi method=get>
    <input type=hidden value=3 name=IncludeBlogs> <input id=search name=search> <input type=submit value=搜索>
</form>
</div>
<a title=PageRank href="http://www.pagerank.net/" target=_blank><img alt=PageRank src="http://www.pagerank.net/pagerank.gif"></a>
<div>STL文章分类 </div>
<div><a href="http://stl.winterxy.com/sitemap.html">所有STL文章列表</a><br><a href="http://stl.winterxy.com/html/cat_eoaai.html">STL技术点滴</a> (13)<br><a href="http://stl.winterxy.com/html/cat_ieaoeoee.html">STL相关知识</a> (5)<br><a href="http://stl.winterxy.com/html/cat_nieii.html">STL学习教程</a> (6)<br><a href="http://stl.winterxy.com/html/cat_oiaeeaie.html">英文资料</a> (8)<br><a href="http://stl.winterxy.com/html/cat_ieoeuoeaeie.html">STL指南&amp;帮助</a> (1)<br><a href="http://stl.winterxy.com/html/cat_eaieieaooe.html">STL资源&amp;资料下载</a> (11)<br>订阅本站:<a href="http://stl.winterxy.com/index.rdf"><img height=12 alt="STL XML" src="http://www.winterxy.com/pic/xml.gif" width=35 border=0></a> <a href="http://www.winterxy.com/cgi-bin/MT2/mt.cgi" target=_blank>管理Blog</a> </div>
<div>最新STL文章 </div>
<div><a href="http://stl.winterxy.com/html/000136.html">C++ Connections 在拉斯维加斯召开年会</a><br><a href="http://stl.winterxy.com/html/000132.html">STL China 上新增两个主题</a><br><a href="http://stl.winterxy.com/html/000119.html">详细解说STL hash_map系列</a><br><a href="http://stl.winterxy.com/html/000113.html">bind2st for_each 和 transform</a><br><a href="http://stl.winterxy.com/html/000109.html">过度使用C++模板</a><br><a href="http://stl.winterxy.com/html/000107.html">详细解说STL string</a><br><a href="http://stl.winterxy.com/html/000104.html">详细解说 STL 排序(Sort)</a><br><a href="http://stl.winterxy.com/html/000103.html">祝贺STLChina STL中文站开通</a><br><a href="http://stl.winterxy.com/html/000095.html">共同翻译STL (STL wiki)</a><br><a href="http://stl.winterxy.com/html/000089.html">Effective STL 中文版电子书下载</a><br><a href="http://stl.winterxy.com/html/000085.html">提供c/c++ reference （STL参考）chm格式文件下载</a><br><a href="http://stl.winterxy.com/html/000084.html">一个比较新的c++ STL参考网站</a><br><a href="http://stl.winterxy.com/html/000081.html">用STL string和标准库fstream实现多个文件比较</a><br><a href="http://stl.winterxy.com/html/000079.html">最新开通STL交流论坛</a><br><a href="http://stl.winterxy.com/html/000078.html">STL中仿函数(functors)、类成员和mem_fun的使用</a><br><a href="http://stl.winterxy.com/html/000073.html">哪些是经典STL书籍？看看老外怎么说。</a><br><a href="http://stl.winterxy.com/html/000072.html">VC6下使用STL注意:不要让内存分配失败导致您的旧版 STL 应用程序崩溃</a><br><a href="http://stl.winterxy.com/html/000071.html">C++ STL(标准模板库) 学习资源列表</a><br><a href="http://stl.winterxy.com/html/000068.html">使用STL流(stream)来简化C++&#8220;线程安全&#8221;日志记录</a><br><a href="http://stl.winterxy.com/html/000067.html">C++ STL中用vector 改进内存的再分配</a><br><a href="http://stl.winterxy.com/html/000066.html">对话STL之父Alex Stepanov</a><br><a href="http://stl.winterxy.com/html/000058.html">体验Visual C++.NET 2005中的STL</a><br><a href="http://stl.winterxy.com/html/000055.html">The C++ Standard Library : A Tutorial and Reference下载</a><br><a href="http://stl.winterxy.com/html/000053.html">Practical Guide to STL(STL 实践指南)－英文</a><br><a href="http://stl.winterxy.com/html/000052.html">Using STL(使用STL)--英文</a><br><a href="http://stl.winterxy.com/html/000051.html">An In-Depth Study of the STL Deque Container(英文)</a><br><a href="http://stl.winterxy.com/html/000048.html">STL源码剖析(候捷)电子书下载</a><br><a href="http://stl.winterxy.com/html/000047.html">标准模板库(STL)介绍(英文版）</a><br><a href="http://stl.winterxy.com/html/000043.html">深入研究STL Allocator</a><br><a href="http://stl.winterxy.com/html/000042.html">用标准模板库STL实现文件比较</a><br><a href="http://stl.winterxy.com/html/000041.html">C++ STL使用教程下载-Alexander版</a><br><a href="http://stl.winterxy.com/html/000039.html">学习STL map, STL set之数据结构基础</a><br><a href="http://stl.winterxy.com/html/000038.html">C++ STL教程电子书下载</a><br><a href="http://stl.winterxy.com/html/000037.html">C++ STL下载和安装</a><br><a href="http://stl.winterxy.com/html/000035.html">STL编程指南(Programmer's Guide)电子书下载</a><br><a href="http://stl.winterxy.com/html/000033.html">STL技术文章不完全列表(STL学习使用指南)</a><br><a href="http://stl.winterxy.com/html/000030.html">Effective STL 中文版(完整版)</a><br><a href="http://stl.winterxy.com/html/000026.html">Effective STL条款31 理解你的排序操作</a><br><a href="http://stl.winterxy.com/html/000024.html">STL之父Alex Stepanov访谈录</a><br><a href="http://stl.winterxy.com/html/000023.html">条款8:不要把auto_ptr放入容器</a><br></div>
<div>链接 </div>
<div><a href="http://www.stlchina.org/bbs/" target=_blank>STL 交流论坛 </a><br><a href="http://www.softat.org/" target=_blank>软件架构(Software Architecture) </a><br><a href="http://www.sgi.com/tech/stl/" target=_blank>SGI STL网站</a><br><a href="http://www.stlport.org/" target=_blank>STLport 网站</a><br><a href="http://boost.sourceforge.net/" target=_blank>Boost C++ Libraries</a><br><a href="http://www.winterxy.com/" target=_blank>Winter's Blog</a><br></div>
<div><a href="http://www.winterxy.com/blog/000029.html" target=_blank ,>联系Winter</a> </div>
</div>
<img src ="http://www.cppblog.com/iniwf/aggbug/76769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iniwf/" target="_blank">iniwf</a> 2009-03-16 21:25 <a href="http://www.cppblog.com/iniwf/archive/2009/03/16/76769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL 中文站</title><link>http://www.cppblog.com/iniwf/archive/2009/03/16/76768.html</link><dc:creator>iniwf</dc:creator><author>iniwf</author><pubDate>Mon, 16 Mar 2009 13:22:00 GMT</pubDate><guid>http://www.cppblog.com/iniwf/archive/2009/03/16/76768.html</guid><wfw:comment>http://www.cppblog.com/iniwf/comments/76768.html</wfw:comment><comments>http://www.cppblog.com/iniwf/archive/2009/03/16/76768.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/iniwf/comments/commentRss/76768.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iniwf/services/trackbacks/76768.html</trackback:ping><description><![CDATA[转自<a href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLChina">http://www.stlchina.org/twiki/bin/view.pl/Main/STLChina</a><br><br>
<h2><a name=saWxMQRzXPRzU></a>STL 中文站 </h2>
STL 是Standard Template Library的缩写，中文名是标准模板库。本站主要介绍不同的STL版本、相关的STL电子书籍、STL技术文档、STL学习教程、STL使用技巧等。
<p>
<h3><a name=saaEAGE3TB4wc></a>关于STL </h3>
<ul>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLLearnResouce"><u><font color=#0000ff>C++ STL(标准模板库) 学习资源列表</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLTechArticles"><u><font color=#0000ff>STL技术文章不完全列表(STL学习使用指南)</font></u></a> </li>
</ul>
<h3><a name=sazFE1xOidcoo></a>STL 电子书籍 </h3>
<ul>
    <li><a href="http://www.stlchina.org/documents/EffectiveSTL/index.html" target=_top><u><font color=#0000ff>Effective STL 中文版</font></u></a>
    <li><a href="http://jjhou.csdn.net/jjwbooks-tass.htm" target=_top><u><font color=#0000ff>STL 源码剖析 - 侯捷</font></u></a>
    <li>另外，推荐一本学习STL之前应该好好看的一本书： </li>
</ul>
<table style="BORDER-RIGHT: #e6e6e6 1px solid; BORDER-TOP: #e6e6e6 1px solid; BORDER-LEFT: #e6e6e6 1px solid; WIDTH: 290px; BORDER-BOTTOM: #e6e6e6 1px solid" cellSpacing=0 cellPadding=0 bgColor=#ffffff>
    <tbody>
        <tr>
            <td align=middle rowSpan=2>
            <div style="MARGIN: 5px auto; WIDTH: 80px; HEIGHT: 80px"><a style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; OVERFLOW: hidden; WIDTH: 80px; PADDING-TOP: 0px; HEIGHT: 80px" href="http://s.click.alimama.com/a/qvYuS5ET3vc=-10145822" target=_blank><img style="MARGIN: 0px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none" src="http://img06.taobaocdn.com/bao/uploaded/i6/T1uTRXXm4bI3yIE63__110135.jpg_sum.jpg"></a></div>
            <div class=clearing></div>
            </td>
            <td colSpan=2><a style="MARGIN: 5px; WIDTH: 180px; COLOR: #0000ff; LINE-HEIGHT: 20px; HEIGHT: 40px" href="http://s.click.alimama.com/a/qvYuS5ET3vc=-10145822" target=_blank><u>C++ Primer中文版(第4版 75折</u></a></td>
        </tr>
        <tr>
            <td noWrap><span style="FONT-WEIGHT: 600; MARGIN: 5px; COLOR: #cc0000; LINE-HEIGHT: 30px">74.2元</span>&nbsp;</td>
            <td noWrap width=100><a href="http://s.click.alimama.com/a/qvYuS5ET3vc=-10145822" target=_blank><img style="MARGIN: 0px; VERTICAL-ALIGN: text-bottom; BORDER-TOP-STYLE: none; LINE-HEIGHT: 24px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none; pandding: 0px" src="http://taoke.alimama.com/images/cps/fgetccode_btn.gif" name=""></a></td>
        </tr>
    </tbody>
</table>
<h3><a name=saqApMBmsReXw></a>STL 技术文章 </h3>
<ul>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailHashMap"><u><font color=#0000ff>详细解说STL hash_map</font></u></a> <img alt=new.gif src="http://www.stlchina.org/twiki/pub/TWiki/TWikiDocGraphics/new.gif">
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLIOStreamIntro"><u><font color=#0000ff>C++ iostream标准库介绍</font></u></a> <img alt=new.gif src="http://www.stlchina.org/twiki/pub/TWiki/TWikiDocGraphics/new.gif">
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString"><u><font color=#0000ff>详细解说STL: string</font></u></a> <img alt=new.gif src="http://www.stlchina.org/twiki/pub/TWiki/TWikiDocGraphics/new.gif">
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLOverdoTemplates"><u><font color=#0000ff>过度使用C++模板(Overdoing C++ Templates)</font></u></a> <img alt=new.gif src="http://www.stlchina.org/twiki/pub/TWiki/TWikiDocGraphics/new.gif">
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLSortAlgorithms"><u><font color=#0000ff>详细解说 STL 排序算法</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLIntroduce"><u><font color=#0000ff>C++ STL标准模板库介绍</font></u></a>
    <li><a href="http://www.stlchina.org/stl_doc/" target=_top><u><font color=#0000ff>SGI STL文档</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLforIni"><u><font color=#0000ff>用STL快速编写ini配置文件识别类</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLEasyStudy"><u><font color=#0000ff>C++ STL编程轻松入门基础</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLWhatAllocator"><u><font color=#0000ff>标准库：Allocator能做什么</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLUsingSTL"><u><font color=#0000ff>STL使用介绍</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/Main/STLPracticalGuide"><u><font color=#0000ff>STL实践指南</font></u></a> </li>
</ul>
<p>
<h2><a name=savoI6osxrLek></a>STL 学习Blog 文章收集 </h2>
<ul>
    <li><a href="http://blog.csdn.net/szynet/archive/2008/04/25/2325715.aspx" target=_top><u><font color=#0000ff>什么是范型编程</font></u></a> - 原文在csdn上查看
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/STL/STLHeapAlgo"><u><font color=#0000ff>仿STL中的堆算法的一个实现</font></u></a> </li>
</ul>
<h2><a name=sa.Ca9riVcWI2></a>泛型编程GP, 范型编程 </h2>
<ul>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/STL/HoujieTrip"><u><font color=#0000ff>泛谈GP/OO/C++ -- 侯捷老师在yahoo的讲座</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/STL/GPAndDesignThink"><u><font color=#0000ff>泛型编程与设计新思维</font></u></a> </li>
</ul>
<p>
<h2><a name=saQ3/dk/tcemQ></a>STL Articles (英文) </h2>
如果英文好，学习计算机会有更多的选择；如果英文不好，那就边学习技术，边学习英文。这里提供一些原版的STL 英文资料，供大家学习使用。
<ul>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/STLEnglish/ModestSTLTutor"><u><font color=#0000ff>A modest STL tutorial</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/STLEnglish/STLMapAssArr"><u><font color=#0000ff>STL Maps -- Associative Arrays</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/STLEnglish/STLStudy101A"><u><font color=#0000ff>STL 101 Part A - Vector</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/STLEnglish/STLStudy101B"><u><font color=#0000ff>STL 101 Part B - List and Iterators</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/STLEnglish/STLStudy101C"><u><font color=#0000ff>STL 101 Part C - Functors</font></u></a>
    <li><a class=twikiLink href="http://www.stlchina.org/twiki/bin/view.pl/STLEnglish/STLStudy101D"><u><font color=#0000ff>STL 101 Part D - sorted associative containers, Set and Map</font></u></a> </li>
</ul>
<p>推荐:学习英语需要持续看一本书。
<table style="BORDER-RIGHT: #e6e6e6 1px solid; BORDER-TOP: #e6e6e6 1px solid; BORDER-LEFT: #e6e6e6 1px solid; WIDTH: 290px; BORDER-BOTTOM: #e6e6e6 1px solid" cellSpacing=0 cellPadding=0 bgColor=#ffffff>
    <tbody>
        <tr>
            <td align=middle rowSpan=2>
            <div style="MARGIN: 5px auto; WIDTH: 80px; HEIGHT: 80px"><a style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; OVERFLOW: hidden; WIDTH: 80px; PADDING-TOP: 0px; HEIGHT: 80px" href="http://s.click.alimama.com/a/qXMULjPzJHE=-10145822" target=_blank><img style="MARGIN: 0px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none" src="http://img04.taobaocdn.com/bao/uploaded/i4/T1bA8bXaRk7ZAOlfg8_070350.jpg_sum.jpg"></a></div>
            <div class=clearing></div>
            </td>
            <td colSpan=2><a style="MARGIN: 5px; WIDTH: 180px; COLOR: #0000ff; LINE-HEIGHT: 20px; HEIGHT: 40px" href="http://s.click.alimama.com/a/qXMULjPzJHE=-10145822" target=_blank><u>【全新正版免快递】UNIX环境高级编程(英文版&#183;</u></a></td>
        </tr>
        <tr>
            <td noWrap><span style="FONT-WEIGHT: 600; MARGIN: 5px; COLOR: #cc0000; LINE-HEIGHT: 30px">69.0元</span>&nbsp;</td>
            <td noWrap width=100><a href="http://s.click.alimama.com/a/qXMULjPzJHE=-10145822" target=_blank><img style="MARGIN: 0px; VERTICAL-ALIGN: text-bottom; BORDER-TOP-STYLE: none; LINE-HEIGHT: 24px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none; pandding: 0px" src="http://taoke.alimama.com/images/cps/fgetccode_btn.gif" name=""></a></td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.cppblog.com/iniwf/aggbug/76768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iniwf/" target="_blank">iniwf</a> 2009-03-16 21:22 <a href="http://www.cppblog.com/iniwf/archive/2009/03/16/76768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>