<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Beyond the Void &#187; 字符串</title>
	<atom:link href="http://www.byvoid.com/blog/tag/%e5%ad%97%e7%ac%a6%e4%b8%b2/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.byvoid.com/blog</link>
	<description></description>
	<lastBuildDate>Tue, 29 Jun 2010 08:44:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>POI 2000 Repetitions 最长公共子串</title>
		<link>http://www.byvoid.com/blog/poi-2000-pow/</link>
		<comments>http://www.byvoid.com/blog/poi-2000-pow/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 06:11:08 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[POI]]></category>
		<category><![CDATA[2000]]></category>
		<category><![CDATA[KMP]]></category>
		<category><![CDATA[Trie]]></category>
		<category><![CDATA[后缀树]]></category>
		<category><![CDATA[子串]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[最]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=789</guid>
		<description><![CDATA[这是一个经典的求多个串的最长公共子串的问题。如果设字符串的个数为N，每个串最大的长度为L，则这道题有时间复杂度为O(N*L^4),O(N*L^3),O(N*L^2)和O(N*L)的算法。 最简单的想法是对于某一个串，... ]]></description>
			<content:encoded><![CDATA[<p>这是一个经典的求多个串的最长公共子串的问题。如果设字符串的个数为N，每个串最大的长度为L，则这道题有时间复杂度为O(N*L^4),O(N*L^3),O(N*L^2)和O(N*L)的算法。</p>
<p>最简单的想法是对于某一个串，取出它的所有的L^2个子串，然后再在其他每一个字符串中进行朴素的匹配，很显然是O(N*L^4)。如果生搬硬套地用KMP，那么是O(N*L^3)的算法。仔细一想，其实枚举所有的L^2个子串是完全没有必要的，仅仅取出某一个串的L个后缀，对于每一个后缀在其他的所有串中部分匹配即可，用朴素匹配就是O(N*L^3)，用KMP就是O(N*L^2)，可以通过所有测试点。</p>
<p>另外，如果用Trie，把每个串的所有后缀全部插入Trie树中，标记每个节点所属的原串。找到最深的属于所有串的节点，它的最大深度就是最长公共前缀，时间复杂度依然是O(N*L^2)，但是会有一点超时。</p>
<p>对于这道题来说，对某个串的每个后缀进行部分模式匹配，O(N*L^2)的算法就可以了。如果想进一步探究，恐怕就要用到后缀树了，广义后缀树求最长公共子串有O(N*L)的算法，我还没有学过，现在正在苦读中。</p>
<p>下面是我的O(N*L^2)的KMP。</p>
<p><span id="more-789"></span></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p789code2'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p7892"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
</pre></td><td class="code" id="p789code2"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: POI2000 pow
 * Author: Guo Jiabao
 * Time: 2009.1.5 13:53
 * State: Solved 
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXL<span style="color: #000080;">=</span><span style="color: #0000dd;">2002</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">6</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> N,Ans,Max<span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> S<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>MAXL<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> Flee<span style="color: #008000;">&#91;</span>MAXL<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pow.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pow.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>N<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		S<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%sn&quot;</span>,S<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> KMP<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>A,<span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>B<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,La,Lb<span style="color: #008080;">;</span>
	La<span style="color: #000080;">=</span><span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>A<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	Lb<span style="color: #000080;">=</span><span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>B<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	Flee<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span>,i<span style="color: #000080;">=</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>Lb<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">&gt;</span><span style="color: #0000dd;">0</span> <span style="color: #000040;">&amp;&amp;</span> B<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> j<span style="color: #000080;">=</span>Flee<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>B<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> j<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
		Flee<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>j<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span>,i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>La<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">&gt;</span><span style="color: #0000dd;">0</span> <span style="color: #000040;">&amp;&amp;</span> B<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> j<span style="color: #000080;">=</span>Flee<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>B<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> j<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">&gt;</span>Max<span style="color: #008000;">&#41;</span>
			Max<span style="color: #000080;">=</span>j<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,Min<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>s<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">=</span>S<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><span style="color: #000040;">*</span>s<span style="color: #008080;">;</span>s<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		Min<span style="color: #000080;">=</span><span style="color: #0000dd;">2000</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			Max<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			KMP<span style="color: #008000;">&#40;</span>S<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>,s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Max <span style="color: #000080;">&lt;</span> Min<span style="color: #008000;">&#41;</span>
				Min<span style="color: #000080;">=</span>Max<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Min<span style="color: #000080;">&gt;</span>Ans<span style="color: #008000;">&#41;</span>
			Ans<span style="color: #000080;">=</span>Min<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,Ans<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<blockquote>
<h2><span class="mw-headline">最长公共子串 </span></h2>
<p>给出几个由小写字母构成的单词，求它们最长的公共子串的长度。</p>
<p>任务</p>
<ul>
<li>从文件中读入单词</li>
<li>计算最长公共子串的长度</li>
<li>输出结果到文件</li>
</ul>
<p>输入</p>
<p>文件的第一行是整数 n，1&lt;=n&lt;=5，表示单词的数量。接下来n行每行一个单词，只由小写字母组成，单词的长度至少为1，最大为2000。</p>
<p>输出：</p>
<p>仅一行，一个整数，最长公共子串的长度。</p>
<p>样例输入：</p>
<pre>3
abcb
bca
acbc</pre>
<p>样例输出：</p>
<pre>2</pre>
</blockquote>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/noi-2000-solution/" title="NOI 2000 解题报告">NOI 2000 解题报告</a></li><li><a href="http://www.byvoid.com/blog/poi-2000-pro/" title="POI 2000 Promotion 促销活动">POI 2000 Promotion 促销活动</a></li><li><a href="http://www.byvoid.com/blog/poi-2000-nar/" title="POI 2000 Skiers 滑雪队">POI 2000 Skiers 滑雪队</a></li><li><a href="http://www.byvoid.com/blog/poi-2000-bro/" title="POI 2000 啤酒厂建造 Where to build a brewery? ">POI 2000 啤酒厂建造 Where to build a brewery? </a></li><li><a href="http://www.byvoid.com/blog/ctsc2000-cupid/" title="CTSC2000 丘比特的烦恼">CTSC2000 丘比特的烦恼</a></li><li><a href="http://www.byvoid.com/blog/noi-2001-solution/" title="NOI 2001 解题报告">NOI 2001 解题报告</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/poi-2000-pow/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C++ string 用法详解</title>
		<link>http://www.byvoid.com/blog/cpp-string/</link>
		<comments>http://www.byvoid.com/blog/cpp-string/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 05:19:28 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[計算機科學]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[用法]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=395</guid>
		<description><![CDATA[C++ string 详解 任何人对本文进行引用都要标明作者是Nicolai M.Josuttis /////////////////////////////////////////////////////////////////////////////////// C++ 语言是个十分优秀的语言，但优秀并不表示完美。还是有许... ]]></description>
			<content:encoded><![CDATA[<p>C++ string 详解</p>
<p>任何人对本文进行引用都要标明作者是Nicolai M.Josuttis </p>
<p>///////////////////////////////////////////////////////////////////////////////////</p>
<p>C++ 语言是个十分优秀的语言，但优秀并不表示完美。还是有许多人不愿意使用C或者C++，为什么？原因众多，其中之一就是C/C++的文本处理功能太麻烦，用起来很不方便。以前没有接触过其他语言时，每当别人这么说，我总是不屑一顾，认为他们根本就没有领会C++的精华，或者不太懂C++，现在我接触 perl, php, 和Shell脚本以后，开始理解了以前为什么有人说C++文本处理不方便了。</p>
<p><span id="more-395"></span></p>
<p>举例来说，如果文本格式是：用户名 电话号码，文件名name.txt<br />
Tom 23245332<br />
Jenny 22231231<br />
Heny 22183942<br />
Tom 23245332<br />
&#8230;</p>
<p>现在我们需要对用户名排序，且只输出不同的姓名。</p>
<p>那么在shell 编程中，可以这样用：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code39'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39539"><td class="code" id="p395code39"><pre class="cpp" style="font-family:monospace;">awk <span style="color: #FF0000;">'{print $1}'</span> name.<span style="color: #007788;">txt</span> <span style="color: #000040;">|</span> sort <span style="color: #000040;">|</span> uniq</pre></td></tr></table></div>

<p>简单吧？</p>
<p>如果使用C/C++ 就麻烦了，他需要做以下工作：<br />
先打开文件，检测文件是否打开，如果失败，则退出。<br />
声明一个足够大得二维字符数组或者一个字符指针数组<br />
读入一行到字符空间<br />
然后分析一行的结构，找到空格，存入字符数组中。<br />
关闭文件<br />
写一个排序函数，或者使用写一个比较函数，使用sort()排序<br />
遍历数组，比较是否有相同的，如果有，则要删除，copy&#8230;<br />
输出信息</p>
<p>你可以用C++或者C语言去实现这个流程。如果一个人的主要工作就是处理这种类似的文本(例如做apache的日志统计和分析),你说他会喜欢C/C++么？</p>
<p>当然，有了STL，这些处理会得到很大的简化。我们可以使用 fstream来代替麻烦的fopen fread fclose, 用vector来代替数组。最重要的是用 string来代替char * 数组，使用sort排序算法来排序，用unique 函数来去重。听起来好像很不错。看看下面代码(例程1）：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code40'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39540"><td class="code" id="p395code40"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
<span style="color: #339900;">#include &lt;fstream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	ifstream in<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;name.txt&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	string strtmp<span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> vect<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>getline<span style="color: #008000;">&#40;</span>in, strtmp, <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	vect.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>strtmp.<span style="color: #007788;">substr</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, strtmp.<span style="color: #007788;">find</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">' '</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	sort<span style="color: #008000;">&#40;</span>vect.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, vect.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> it<span style="color: #000080;">=</span>unique<span style="color: #008000;">&#40;</span>vect.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, vect.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	copy<span style="color: #008000;">&#40;</span>vect.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, it, ostream_iterator<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cout</span>, <span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>也还不错吧，至少会比想象得要简单得多！（代码里面没有对错误进行处理，只是为了说明问题，不要效仿).</p>
<p>当然，在这个文本格式中，不用vector而使用map会更有扩充性，例如，还可通过人名找电话号码等等，但是使用了map就不那么好用sort了。你可以用map试一试。</p>
<p>这里string的作用不只是可以存储字符串，还可以提供字符串的比较，查找等。在sort和unique函数中就默认使用了less 和equal_to函数, 上面的一段代码，其实使用了string的以下功能：<br />
存储功能，在getline() 函数中<br />
查找功能，在find() 函数中<br />
子串功能，在substr() 函数中<br />
string operator < , 默认在sort() 函数中调用<br />
string operator == , 默认在unique() 函数中调用</p>
<p>总之，有了string 后，C++的字符文本处理功能总算得到了一定补充，加上配合STL其他容器使用，其在文本处理上的功能已经与perl, shell, php的距离缩小很多了。 因此掌握string 会让你的工作事半功倍。</p>
<p>1 string 使用</p>
<p>其实，string并不是一个单独的容器，只是basic_string 模板类的一个typedef 而已，相对应的还有wstring, 你在string 头文件中你会发现下面的代码:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code41'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39541"><td class="code" id="p395code41"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">extern</span> <span style="color: #FF0000;">&quot;C++&quot;</span> <span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">typedef</span> basic_string <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">char</span><span style="color: #000080;">&gt;</span> string<span style="color: #008080;">;</span>
<span style="color: #0000ff;">typedef</span> basic_string <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">wchar_t</span><span style="color: #000080;">&gt;</span> wstring<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// extern &quot;C++&quot;</span></pre></td></tr></table></div>

<p>由于只是解释string的用法，如果没有特殊的说明，本文并不区分string 和 basic_string的区别。</p>
<p>string 其实相当于一个保存字符的序列容器，因此除了有字符串的一些常用操作以外，还有包含了所有的序列容器的操作。字符串的常用操作包括：增加、删除、修改、查找比较、链接、输入、输出等。详细函数列表参看附录。不要害怕这么多函数，其实有许多是序列容器带有的，平时不一定用的上。</p>
<p>如果你要想了解所有函数的详细用法，你需要查看basic_string，或者下载STL编程手册。这里通过实例介绍一些常用函数。</p>
<p>1.1 充分使用string 操作符</p>
<p>string 重载了许多操作符，包括 +, +=, <, =, , [], <<, >>等，正式这些操作符，对字符串操作非常方便。先看看下面这个例子：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code42'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39542"><td class="code" id="p395code42"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string strinfo<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;Please input your name:&quot;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> strinfo <span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> strinfo<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> strinfo <span style="color: #000080;">==</span> <span style="color: #FF0000;">&quot;winter&quot;</span> <span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;you are winter!&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> strinfo <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;wende&quot;</span> <span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;you are not wende!&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> strinfo <span style="color: #000080;">&lt;</span> <span style="color: #FF0000;">&quot;winter&quot;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;your name should be ahead of winter&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;your name should be after of winter&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	strinfo <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot; , Welcome to China!&quot;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> strinfo<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;Your name is :&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	string strtmp <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;How are you? &quot;</span> <span style="color: #000040;">+</span> strinfo<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span> <span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> strtmp.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> i <span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>strtmp<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>下面是程序的输出</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code43'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39543"><td class="code" id="p395code43"><pre class="cpp" style="font-family:monospace;">Please input your name<span style="color: #008080;">:</span>Hero
you are not wende<span style="color: #000040;">!</span>
Hero , Welcome to China<span style="color: #000040;">!</span>
How are you<span style="color: #008080;">?</span> Hero , Welcome to China<span style="color: #000040;">!</span></pre></td></tr></table></div>

<p>有了这些操作符，在STL中仿函数都可以直接使用string作为参数，例如 less, great, equal_to 等，因此在把string作为参数传递的时候，它的使用和int 或者float等已经没有什么区别了。例如，你可以使用：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code44'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39544"><td class="code" id="p395code44"><pre class="cpp" style="font-family:monospace;">map<span style="color: #000080;">&lt;</span>string, <span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> mymap<span style="color: #008080;">;</span> <span style="color: #666666;">//以上默认使用了 less&lt;string&gt;</span></pre></td></tr></table></div>

<p>有了 operator + 以后，你可以直接连加，例如：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code45'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39545"><td class="code" id="p395code45"><pre class="cpp" style="font-family:monospace;">string strinfo<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;Winter&quot;</span><span style="color: #008080;">;</span>
string strlast<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;Hello &quot;</span> <span style="color: #000040;">+</span> strinfo <span style="color: #000040;">+</span> <span style="color: #FF0000;">&quot;!&quot;</span><span style="color: #008080;">;</span>
string strtest<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;Hello &quot;</span> <span style="color: #000040;">+</span> strinfo <span style="color: #000040;">+</span> <span style="color: #FF0000;">&quot; Welcome&quot;</span> <span style="color: #000040;">+</span> <span style="color: #FF0000;">&quot; to China&quot;</span> <span style="color: #000040;">+</span> <span style="color: #FF0000;">&quot; !&quot;</span><span style="color: #008080;">;</span><span style="color: #666666;">//你还可以这样：</span></pre></td></tr></table></div>

<p>看见其中的特点了吗？只要你的等式里面有一个 string 对象，你就可以一直连续&#8221;+&#8221;，但有一点需要保证的是，在开始的两项中，必须有一项是 string 对象。其原理很简单：</p>
<p>系统遇到&#8221;+&#8221;号，发现有一项是string 对象。<br />
系统把另一项转化为一个临时 string 对象。<br />
执行 operator + 操作，返回新的临时string 对象。<br />
如果又发现&#8221;+&#8221;号，继续第一步操作。</p>
<p>由于这个等式是由左到右开始检测执行，如果开始两项都是const char* ，程序自己并没有定义两个const char* 的加法，编译的时候肯定就有问题了。</p>
<p>有了操作符以后，assign(), append(), compare(), at()等函数，除非有一些特殊的需求时，一般是用不上。当然at()函数还有一个功能，那就是检查下标是否合法，如果是使用：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code46'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39546"><td class="code" id="p395code46"><pre class="cpp" style="font-family:monospace;">string str<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;winter&quot;</span><span style="color: #008080;">;</span><span style="color: #666666;">//下面一行有可能会引起程序中断错误</span>
str<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'!'</span><span style="color: #008080;">;</span><span style="color: #666666;">//下面会抛出异常:throws: out_of_range</span>
<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>str.<span style="color: #007788;">at</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">100</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>了解了吗？如果你希望效率高，还是使用[]来访问，如果你希望稳定性好，最好使用at()来访问。</p>
<p>1.2 眼花缭乱的string find 函数</p>
<p>由于查找是使用最为频繁的功能之一，string 提供了非常丰富的查找函数。其列表如下：<br />
函数名 描述 find 查找 rfind 反向查找 find_first_of 查找包含子串中的任何字符，返回第一个位置 find_first_not_of 查找不包含子串中的任何字符，返回第一个位置 find_last_of 查找包含子串中的任何字符，返回最后一个位置 find_last_not_of 查找不包含子串中的任何字符，返回最后一个位置以上函数都是被重载了4次，以下是以find_first_of 函数为例说明他们的参数，其他函数和其参数一样，也就是说总共有24个函数 ：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code47'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39547"><td class="code" id="p395code47"><pre class="cpp" style="font-family:monospace;">size_type find_first_of<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> basic_string<span style="color: #000040;">&amp;</span> s, size_type pos <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
size_type find_first_of<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> charT<span style="color: #000040;">*</span> s, size_type pos, size_type n<span style="color: #008000;">&#41;</span>
size_type find_first_of<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> charT<span style="color: #000040;">*</span> s, size_type pos <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
size_type find_first_of<span style="color: #008000;">&#40;</span>charT c, size_type pos <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span></pre></td></tr></table></div>

<p>所有的查找函数都返回一个size_type类型，这个返回值一般都是所找到字符串的位置，如果没有找到，则返回string::npos。有一点需要特别注意，所有和string::npos的比较一定要用string::size_type来使用，不要直接使用int 或者unsigned int等类型。其实string::npos表示的是-1, 看看头文件：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code48'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39548"><td class="code" id="p395code48"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> _CharT, <span style="color: #0000ff;">class</span> _Traits, <span style="color: #0000ff;">class</span> _Alloc<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">const</span> basic_string<span style="color: #000080;">&lt;</span>_CharT,_Traits,_Alloc<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">size_type</span>
basic_string<span style="color: #000080;">&lt;</span>_CharT,_Traits,_Alloc<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">npos</span>
<span style="color: #000080;">=</span> basic_string<span style="color: #000080;">&lt;</span>_CharT,_Traits,_Alloc<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">size_type</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>find 和 rfind 都还比较容易理解，一个是正向匹配，一个是逆向匹配，后面的参数pos都是用来指定起始查找位置。对于find_first_of 和find_last_of 就不是那么好理解。</p>
<p>find_first_of 是给定一个要查找的字符集，找到这个字符集中任何一个字符所在字符串中第一个位置。或许看一个例子更容易明白。</p>
<p>有这样一个需求：过滤一行开头和结尾的所有非英文字符。看看用string 如何实现：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code49'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39549"><td class="code" id="p395code49"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string strinfo<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot; //*---Hello Word!......------&quot;</span><span style="color: #008080;">;</span>
	string strset<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&quot;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> first <span style="color: #000080;">=</span> strinfo.<span style="color: #007788;">find_first_of</span><span style="color: #008000;">&#40;</span>strset<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>first <span style="color: #000080;">==</span> string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;not find any characters&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">int</span> last <span style="color: #000080;">=</span> strinfo.<span style="color: #007788;">find_last_of</span><span style="color: #008000;">&#40;</span>strset<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>last <span style="color: #000080;">==</span> string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;not find any characters&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> strinfo.<span style="color: #007788;">substr</span><span style="color: #008000;">&#40;</span>first, last <span style="color: #000040;">-</span> first <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>这里把所有的英文字母大小写作为了需要查找的字符集，先查找第一个英文字母的位置，然后查找最后一个英文字母的位置，然后用substr 来的到中间的一部分，用于输出结果。下面就是其结果：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code50'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39550"><td class="code" id="p395code50"><pre class="cpp" style="font-family:monospace;">Hello Word</pre></td></tr></table></div>

<p>前面的符号和后面的符号都没有了。像这种用法可以用来查找分隔符，从而把一个连续的字符串分割成为几部分，达到 shell 命令中的 awk 的用法。特别是当分隔符有多个的时候，可以一次指定。例如有这样的需求：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code51'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39551"><td class="code" id="p395code51"><pre class="cpp" style="font-family:monospace;">张三<span style="color: #000040;">|</span><span style="color: #0000dd;">3456123</span>, 湖南
李四,<span style="color: #0000dd;">4564234</span><span style="color: #000040;">|</span> 湖北
王小二, <span style="color: #0000dd;">4433253</span><span style="color: #000040;">|</span>北京
...</pre></td></tr></table></div>

<p>我们需要以 &#8220;|&#8221; &#8220;,&#8221;为分隔符，同时又要过滤空格，把每行分成相应的字段。可以作为你的一个作业来试试，要求代码简洁。</p>
<p>1.3 string insert, replace, erase</p>
<p>了解了string 的操作符，查找函数和substr，其实就已经了解了string的80%的操作了。insert函数, replace函数和erase函数在使用起来相对简单。下面以一个例子来说明其应用。<br />
string只是提供了按照位置和区间的replace函数，而不能用一个string字串来替换指定string中的另一个字串。这里写一个函数来实现这个功能：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code52'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39552"><td class="code" id="p395code52"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> string_replace<span style="color: #008000;">&#40;</span>string <span style="color: #000040;">&amp;</span> strBig, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span> strsrc, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span>strdst<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> pos<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> srclen<span style="color: #000080;">=</span>strsrc.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> dstlen<span style="color: #000080;">=</span>strdst.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>pos<span style="color: #000080;">=</span>strBig.<span style="color: #007788;">find</span><span style="color: #008000;">&#40;</span>strsrc, pos<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		strBig.<span style="color: #007788;">replace</span><span style="color: #008000;">&#40;</span>pos, srclen, strdst<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		pos <span style="color: #000040;">+</span><span style="color: #000080;">=</span> dstlen<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>看看如何调用：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code53'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39553"><td class="code" id="p395code53"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string strinfo<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;This is Winter, Winter is a programmer. Do you know Winter?&quot;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;Orign string is :<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #000080;">&lt;&lt;</span>strinfo<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	string_replace<span style="color: #008000;">&#40;</span>strinfo, <span style="color: #FF0000;">&quot;Winter&quot;</span>, <span style="color: #FF0000;">&quot;wende&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;After replace Winter with wende, the string is :<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #000080;">&lt;&lt;</span>strinfo<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>其输出结果：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code54'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39554"><td class="code" id="p395code54"><pre class="cpp" style="font-family:monospace;">Orign string is <span style="color: #008080;">:</span>
This is Winter, Winter is a programmer. <span style="color: #007788;">Do</span> you know Winter<span style="color: #008080;">?</span>
After replace Winter with wende, the string is <span style="color: #008080;">:</span>
This is wende, wende is a programmer. <span style="color: #007788;">Do</span> you know wende<span style="color: #008080;">?</span></pre></td></tr></table></div>

<p>如果不用replace函数，则可以使用erase和insert来替换，也能实现string_replace函数的功能：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code55'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39555"><td class="code" id="p395code55"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> string_replace<span style="color: #008000;">&#40;</span>string <span style="color: #000040;">&amp;</span> strBig, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span> strsrc, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span>strdst<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> pos<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> srclen<span style="color: #000080;">=</span>strsrc.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> dstlen<span style="color: #000080;">=</span>strdst.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>pos<span style="color: #000080;">=</span>strBig.<span style="color: #007788;">find</span><span style="color: #008000;">&#40;</span>strsrc, pos<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		strBig.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>pos, srclen<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		strBig.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>pos, strdst<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		pos <span style="color: #000040;">+</span><span style="color: #000080;">=</span> dstlen<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>当然，这种方法没有使用replace来得直接。</p>
<p>2 string 和C-style字符串</p>
<p>现在看了这么多例子，发现const char* 可以和string 直接转换，例如我们在上面的例子中，使用</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code56'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39556"><td class="code" id="p395code56"><pre class="cpp" style="font-family:monospace;">string_replace<span style="color: #008000;">&#40;</span>strinfo, <span style="color: #FF0000;">&quot;Winter&quot;</span>, <span style="color: #FF0000;">&quot;wende&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>来代用<span style="color: #0000ff;">void</span> string_replace<span style="color: #008000;">&#40;</span>string <span style="color: #000040;">&amp;</span> strBig, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span> strsrc, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span>strdst<span style="color: #008000;">&#41;</span></pre></td></tr></table></div>

<p>在C语言中只有char* 和 const char*，为了使用起来方便，string提供了三个函数满足其要求：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code57'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39557"><td class="code" id="p395code57"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> charT<span style="color: #000040;">*</span> c_str<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #0000ff;">const</span> charT<span style="color: #000040;">*</span> data<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
size_type copy<span style="color: #008000;">&#40;</span>charT<span style="color: #000040;">*</span> buf, size_type n, size_type pos <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span></pre></td></tr></table></div>

<p>其中：<br />
c_str 直接返回一个以\0结尾的字符串。<br />
data 直接以数组方式返回string的内容，其大小为size()的返回值，结尾并没有\0字符。<br />
copy 把string的内容拷贝到buf空间中。<br />
你或许会问，c_str()的功能包含data()，那还需要data()函数干什么？看看源码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code58'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39558"><td class="code" id="p395code58"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> charT<span style="color: #000040;">*</span> c_str <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>length <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;&quot;</span><span style="color: #008080;">;</span>
	terminate <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> data <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>原来c_str()的流程是：先调用terminate()，然后在返回data()。因此如果你对效率要求比较高，而且你的处理又不一定需要以\0的方式结束，你最好选择data()。但是对于一般的C函数中，需要以const char*为输入参数，你就要使用c_str()函数。</p>
<p>对于c_str() data()函数，返回的数组都是由string本身拥有，千万不可修改其内容。其原因是许多string实现的时候采用了引用机制，也就是说，有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。详细的解释和实现查看Effective STL的条款15：小心string实现的多样性。</p>
<p>另外在你的程序中，只在需要时才使用c_str()或者data()得到字符串，每调用一次，下次再使用就会失效，如：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code59'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39559"><td class="code" id="p395code59"><pre class="cpp" style="font-family:monospace;">string strinfo<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;this is Winter&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
...
<span style="color: #666666;">//最好的方式是:</span>
foo<span style="color: #008000;">&#40;</span>strinfo.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//也可以这么用:</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> pstr<span style="color: #000080;">=</span>strinfo.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
foo<span style="color: #008000;">&#40;</span>pstr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//不要再使用了pstr了, 下面的操作已经使pstr无效了。</span>
strinfo <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot; Hello!&quot;</span><span style="color: #008080;">;</span>
foo<span style="color: #008000;">&#40;</span>pstr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//错误！</span></pre></td></tr></table></div>

<p>会遇到什么错误？当你幸运的时候pstr可能只是指向&#8221;this is Winter Hello!&#8221;的字符串，如果不幸运，就会导致程序出现其他问题，总会有一些不可遇见的错误。总之不会是你预期的那个结果。</p>
<p>3 string 和 Charactor Traits<br />
了解了string的用法，该详细看看string的真相了。前面提到string 只是basic_string的一个typedef。看看basic_string 的参数：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code60'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39560"><td class="code" id="p395code60"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> charT, <span style="color: #0000ff;">class</span> traits <span style="color: #000080;">=</span> char_traits<span style="color: #000080;">&lt;</span>charT<span style="color: #000080;">&gt;</span>,
<span style="color: #0000ff;">class</span> Allocator <span style="color: #000080;">=</span> allocator<span style="color: #000080;">&lt;</span>charT<span style="color: #000080;">&gt;</span> <span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> basic_string
<span style="color: #008000;">&#123;</span>
<span style="color: #666666;">//...</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>char_traits不仅是在basic_string 中有用，在basic_istream 和 basic_ostream中也需要用到。<br />
就像Steve Donovan在过度使用C++模板中提到的，这些确实有些过头了，要不是系统自己定义了相关的一些属性，而且用了个typedef，否则还真不知道如何使用。</p>
<p>但复杂总有复杂道理。有了char_traits，你可以定义自己的字符串类型。当然，有了char_traits < char > 和char_traits < wchar_t > 你的需求使用已经足够了，为了更好的理解string ，咱们来看看char_traits都有哪些要求。</p>
<p>如果你希望使用你自己定义的字符，你必须定义包含下列成员的结构： 表达式 描述</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code61'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39561"><td class="code" id="p395code61"><pre class="cpp" style="font-family:monospace;">char_type 字符类型
int_type <span style="color: #0000ff;">int</span> 类型
pos_type 位置类型
off_type 表示位置之间距离的类型
state_type 表示状态的类型
assign<span style="color: #008000;">&#40;</span>c1,c2<span style="color: #008000;">&#41;</span> 把字符c2赋值给c1
eq<span style="color: #008000;">&#40;</span>c1,c2<span style="color: #008000;">&#41;</span> 判断c1,c2 是否相等
lt<span style="color: #008000;">&#40;</span>c1,c2<span style="color: #008000;">&#41;</span> 判断c1是否小于c2
length<span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span> 判断str的长度
compare<span style="color: #008000;">&#40;</span>s1,s2,n<span style="color: #008000;">&#41;</span> 比较s1和s2的前n个字符
copy<span style="color: #008000;">&#40;</span>s1,s2, n<span style="color: #008000;">&#41;</span> 把s2的前n个字符拷贝到s1中
move<span style="color: #008000;">&#40;</span>s1,s2, n<span style="color: #008000;">&#41;</span> 把s2中的前n个字符移动到s1中
assign<span style="color: #008000;">&#40;</span>s,n,c<span style="color: #008000;">&#41;</span> 把s中的前n个字符赋值为c
find<span style="color: #008000;">&#40;</span>s,n,c<span style="color: #008000;">&#41;</span> 在s的前n个字符内查找c
eof<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> 返回end<span style="color: #000040;">-</span>of<span style="color: #000040;">-</span>file
to_int_type<span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span> 将c转换成int_type
to_char_type<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span> 将i转换成char_type
not_eof<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span> 判断i是否为<span style="color: #0000ff;">EOF</span>
eq_int_type<span style="color: #008000;">&#40;</span>i1,i2<span style="color: #008000;">&#41;</span> 判断i1和i2是否相等</pre></td></tr></table></div>

<p>想看看实际的例子，你可以看看sgi STL的char_traits结构源码.</p>
<p>现在默认的string版本中，并不支持忽略大小写的比较函数和查找函数，如果你想练练手，你可以试试改写一个char_traits , 然后生成一个case_string类, 也可以在string 上做继承，然后派生一个新的类，例如：ext_string，提供一些常用的功能，例如：</p>
<p>定义分隔符。给定分隔符，把string分为几个字段。<br />
提供替换功能。例如，用winter, 替换字符串中的wende<br />
大小写处理。例如，忽略大小写比较，转换等<br />
整形转换。例如把&#8221;123&#8243;字符串转换为123数字。<br />
这些都是常用的功能，如果你有兴趣可以试试。其实有人已经实现了，看看Extended STL string。如果你想偷懒，下载一个头文件就可以用，有了它确实方便了很多。要是有人能提供一个支持正则表达式的string，我会非常乐意用。</p>
<p>4 string 建议<br />
使用string 的方便性就不用再说了，这里要重点强调的是string的安全性。<br />
string并不是万能的，如果你在一个大工程中需要频繁处理字符串，而且有可能是多线程，那么你一定要慎重(当然，在多线程下你使用任何STL容器都要慎重)。<br />
string的实现和效率并不一定是你想象的那样，如果你对大量的字符串操作，而且特别关心其效率，那么你有两个选择，首先，你可以看看你使用的STL版本中string实现的源码；另一选择是你自己写一个只提供你需要的功能的类。<br />
string的c_str()函数是用来得到C语言风格的字符串，其返回的指针不能修改其空间。而且在下一次使用时重新调用获得新的指针。<br />
string的data()函数返回的字符串指针不会以&#8217;\0&#8242;结束，千万不可忽视。<br />
尽量去使用操作符，这样可以让程序更加易懂</p>
<p>5 小结<br />
难怪有人说：string 使用方便功能强，我们一直用它！</p>
<p>6 附录</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code62'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39562"><td class="code" id="p395code62"><pre class="cpp" style="font-family:monospace;">string 函数列表 函数名 描述
begin 得到指向字符串开头的Iterator
end 得到指向字符串结尾的Iterator
rbegin 得到指向反向字符串开头的Iterator
rend 得到指向反向字符串结尾的Iterator
size 得到字符串的大小
length 和size函数功能相同
max_size 字符串可能的最大大小
capacity 在不重新分配内存的情况下，字符串可能的大小
empty 判断是否为空
operator<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> 取第几个元素，相当于数组
c_str 取得C风格的<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> 字符串
data 取得字符串内容地址
operator<span style="color: #000080;">=</span> 赋值操作符
reserve 预留空间
swap 交换函数
insert 插入字符
append 追加字符
push_back 追加字符
operator<span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> 操作符
erase 删除字符串
clear 清空字符容器中所有内容
resize 重新分配空间
assign 和赋值操作符一样
replace 替代
copy 字符串到空间
find 查找
rfind 反向查找
find_first_of 查找包含子串中的任何字符，返回第一个位置
find_first_not_of 查找不包含子串中的任何字符，返回第一个位置
find_last_of 查找包含子串中的任何字符，返回最后一个位置
find_last_not_of 查找不包含子串中的任何字符，返回最后一个位置
substr 得到字串
compare 比较字符串
operator<span style="color: #000040;">+</span> 字符串链接
operator<span style="color: #000080;">==</span> 判断是否相等
operator<span style="color: #000040;">!</span><span style="color: #000080;">=</span> 判断是否不等于
operator<span style="color: #000080;">&lt;</span> 判断是否小于
operator<span style="color: #000080;">&gt;&gt;</span> 从输入流中读入字符串
operator<span style="color: #000080;">&lt;&lt;</span> 字符串写入输出流
getline 从输入流中读入一行</pre></td></tr></table></div>

<p>///////////////////////////////////////////////////////////////////////////////////</p>
<p>之所以抛弃char*的字符串而选用C++标准程序库中的string类，是因为他和前者比较起来，不必担心内存是否足够、字符串长度等等，而且作为一个类出现，他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作，== 进行比较，+ 做串联（是不是很简单?）。我们尽可以把它看成是C++的基本数据类型。<br />
    好了，进入正题………<br />
首先，为了在我们的程序中使用string类型，我们必须包含头文件 <string>。如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code63'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39563"><td class="code" id="p395code63"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt; //注意这里不是string.h string.h是C字符串头文件</span></pre></td></tr></table></div>

<p>1．声明一个C++字符串<br />
声明一个字符串变量很简单：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code64'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39564"><td class="code" id="p395code64"><pre class="cpp" style="font-family:monospace;">string Str<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>这样我们就声明了一个字符串变量，但既然是一个类，就有构造函数和析构函数。上面的声明没有传入参数，所以就直接使用了string的默认的构造函数，这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code65'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39565"><td class="code" id="p395code65"><pre class="cpp" style="font-family:monospace;">a<span style="color: #008000;">&#41;</span>    string s<span style="color: #008080;">;</span>  <span style="color: #666666;">//生成一个空字符串s</span>
b<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//拷贝构造函数 生成str的复制品</span>
c<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>str,stridx<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将字符串str内“始于位置stridx”的部分当作字符串的初值</span>
d<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>str,stridx,<span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值</span>
e<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>cstr<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将C字符串作为s的初值</span>
f<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>chars,chars_len<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将C字符串前chars_len个字符作为字符串s的初值。</span>
g<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>num,c<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//生成一个字符串，包含num个c字符</span>
h<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>beg,end<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//以区间beg;end(不包含end)内的字符作为字符串s的初值</span>
i<span style="color: #008000;">&#41;</span>    s.~string<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//销毁所有字符，释放内存</span></pre></td></tr></table></div>

<p>都很简单，我就不解释了。</p>
<p>2．字符串操作函数<br />
这里是C++字符串的重点，我先把各种操作函数罗列出来，不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数，再到后面看他的详细解释。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code66'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39566"><td class="code" id="p395code66"><pre class="cpp" style="font-family:monospace;">a<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span>,assign<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   <span style="color: #666666;">//赋以新值</span>
b<span style="color: #008000;">&#41;</span> swap<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   <span style="color: #666666;">//交换两个字符串的内容</span>
c<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span>,append<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,push_back<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//在尾部添加字符</span>
d<span style="color: #008000;">&#41;</span> insert<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//插入字符</span>
e<span style="color: #008000;">&#41;</span> erase<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//删除字符</span>
f<span style="color: #008000;">&#41;</span> clear<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//删除全部字符</span>
g<span style="color: #008000;">&#41;</span> replace<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//替换字符</span>
h<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #666666;">//串联字符串</span>
i<span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span>,<span style="color: #000040;">!</span><span style="color: #000080;">=</span>,<span style="color: #000080;">&lt;</span>,<span style="color: #000080;">&lt;=</span>,<span style="color: #000080;">&gt;</span>,<span style="color: #000080;">&gt;=</span>,compare<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>  <span style="color: #666666;">//比较字符串</span>
j<span style="color: #008000;">&#41;</span> size<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,length<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>  <span style="color: #666666;">//返回字符数量</span>
k<span style="color: #008000;">&#41;</span> max_size<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//返回字符的可能最大个数</span>
l<span style="color: #008000;">&#41;</span> empty<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>  <span style="color: #666666;">//判断字符串是否为空</span>
m<span style="color: #008000;">&#41;</span> capacity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//返回重新分配之前的字符容量</span>
n<span style="color: #008000;">&#41;</span> reserve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//保留一定量内存以容纳一定数量的字符</span>
o<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#91;</span> <span style="color: #008000;">&#93;</span>, at<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//存取单一字符</span>
p<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;&gt;</span>,getline<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//从stream读取某值</span>
q<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span>  <span style="color: #666666;">//将谋值写入stream</span>
r<span style="color: #008000;">&#41;</span> copy<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将某值赋值为一个C_string</span>
s<span style="color: #008000;">&#41;</span> c_str<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将内容以C_string返回</span>
t<span style="color: #008000;">&#41;</span> data<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将内容以字符数组形式返回</span>
u<span style="color: #008000;">&#41;</span> substr<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//返回某个子字符串</span>
v<span style="color: #008000;">&#41;</span>查找函数
w<span style="color: #008000;">&#41;</span>begin<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> end<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//提供类似STL的迭代器支持</span>
x<span style="color: #008000;">&#41;</span> rbegin<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> rend<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//逆向迭代器</span>
y<span style="color: #008000;">&#41;</span> get_allocator<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//返回配置器</span></pre></td></tr></table></div>

<p>下面详细介绍：</p>
<p>2．1 C++字符串和C字符串的转换</p>
<p>    C++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy()，其中，data()以字符数组的形式返回字符串内容，但并不添加’\0’。c_str()返回一个以‘\0’结尾的字符数组，而copy()则把字符串的内容复制或写入既有的c_string 或字符数组内。C++字符串并不以’\0’结尾。我的建议是在程序中能使用C++字符串就使用，除非万不得已不选用c_string。由于只是简单介绍，详细介绍掠过，谁想进一步了解使用中的注意事项可以给我留言(到我的收件箱)。我详细解释。</p>
<p>2．2 大小和容量函数<br />
    一个C++字符串存在三种大小：a)现有的字符数，函数是size()和length()，他们等效。Empty()用来检查字符串是否为空。 b)max_size() 这个大小是指当前C++字符串最多能包含的字符数，很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。我们一般情况下不用关心他，应该大小足够我们用的。但是不够用的话，会抛出length_error异常c)capacity()重新分配内存之前 string所能包含的最大字符数。这里另一个需要指出的是reserve()函数，这个函数为string重新分配内存。重新分配的大小由其参数决定，默认参数为0，这时候会对string进行非强制性缩减。</p>
<p>还有必要再重复一下C++字符串和C字符串转换的问题，许多人会遇到这样的问题，自己做的程序要调用别人的函数、类什么的（比如数据库连接函数 Connect(char*,char*)），但别人的函数参数用的是char*形式的，而我们知道，c_str()、data()返回的字符数组由该字符串拥有，所以是一种const char*,要想作为上面提及的函数的参数，还必须拷贝到一个char*,而我们的原则是能不使用C字符串就不使用。那么，这时候我们的处理方式是：如果此函数对参数(也就是char*)的内容不修改的话，我们可以这样Connect((char*)UserID.c_str(), (char*)PassWD.c_str()),但是这时候是存在危险的，因为这样转换后的字符串其实是可以修改的（有兴趣地可以自己试一试），所以我强调除非函数调用的时候不对参数进行修改，否则必须拷贝到一个char*上去。当然，更稳妥的办法是无论什么情况都拷贝到一个char*上去。同时我们也祈祷现在仍然使用C字符串进行编程的高手们（说他们是高手一点儿也不为过，也许在我们还穿开裆裤的时候他们就开始编程了，哈哈…）写的函数都比较规范，那样我们就不必进行强制转换了。</p>
<p>2．3元素存取<br />
    我们可以使用下标操作符[]和函数at()对元素包含的字符进行访问。但是应该注意的是操作符[]并不检查索引是否有效（有效索引 0~str.length()），如果索引失效，会引起未定义的行为。而at()会检查，如果使用at()的时候索引无效，会抛出 out_of_range异常。<br />
    有一个例外不得不说，const string a;的操作符[]对索引值是a.length()仍然有效，其返回值是’\0’。其他的各种情况，a.length()索引都是无效的。举例如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code67'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39567"><td class="code" id="p395code67"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> string Cstr<span style="color: #008000;">&#40;</span>“<span style="color: #0000ff;">const</span> string”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
string Str<span style="color: #008000;">&#40;</span>“string”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
Str<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>    <span style="color: #666666;">//ok</span>
Str.<span style="color: #007788;">at</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">//ok</span>
&nbsp;
Str<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//未定义的行为</span>
Str.<span style="color: #007788;">at</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">100</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">//throw out_of_range</span>
&nbsp;
Str<span style="color: #008000;">&#91;</span>Str.<span style="color: #007788;">length</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>  <span style="color: #666666;">//未定义行为</span>
Cstr<span style="color: #008000;">&#91;</span>Cstr.<span style="color: #007788;">length</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span> <span style="color: #666666;">//返回 ‘\0’</span>
Str.<span style="color: #007788;">at</span><span style="color: #008000;">&#40;</span>Str.<span style="color: #007788;">length</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//throw out_of_range</span>
Cstr.<span style="color: #007788;">at</span><span style="color: #008000;">&#40;</span>Cstr.<span style="color: #007788;">length</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">////throw out_of_range</span></pre></td></tr></table></div>

<p>我不赞成类似于下面的引用或指针赋值：<br />
char&#038; r=s[2];<br />
char* p= &#038;s[3];</p>
<p>因为一旦发生重新分配，r,p立即失效。避免的方法就是不使用。</p>
<p>2．4比较函数<br />
    C++字符串支持常见的比较操作符（>,>=,<,<=,==,!=），甚至支持string与C-string的比较(如 str<”hello”)。在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。字典排序靠前的字符小，比较的顺序是从前向后比较，遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时，string(“aaaa”) <string(aaaaa)。<br />
    另一个功能强大的比较函数是成员函数compare()。他支持多参数处理，支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果，返回值意义如下：0-相等 〉0-大于 <0-小于。举例如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code68'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39568"><td class="code" id="p395code68"><pre class="cpp" style="font-family:monospace;">string s<span style="color: #008000;">&#40;</span>“abcd”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span>“abcd”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//返回0</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span>“dcba”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//返回一个小于0的值</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span>“ab”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//返回大于0的值</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span>s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//相等</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">2</span>,s,<span style="color: #0000dd;">2</span>,<span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//用”ab”和”cd”进行比较 小于零</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">2</span>,”bcx”,<span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//用”bc”和”bc”比较。</span></pre></td></tr></table></div>

<p>怎么样？功能够全的吧！什么？还不能满足你的胃口？好吧，那等着，后面有更个性化的比较算法。先给个提示，使用的是STL的比较算法。什么？对STL一窍不通？你重修吧！</p>
<p>2．5 更改内容<br />
这在字符串的操作中占了很大一部分。<br />
首先讲赋值，第一个赋值方法当然是使用操作符=，新值可以是string(如：s=ns) 、c_string(如：s=”gaint”)甚至单一字符（如：s=’j’）。还可以使用成员函数assign()，这个成员函数可以使你更灵活的对字符串赋值。还是举例说明吧：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code69'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39569"><td class="code" id="p395code69"><pre class="cpp" style="font-family:monospace;">s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//直接</span>
s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span>str,<span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//如果str是”iamangel” 就是把”ama”赋给字符串</span>
s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span>str,<span style="color: #0000dd;">2</span>,string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//把字符串str从索引值2开始到结尾赋给s</span>
s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span>“gaint”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//不说</span>
s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span>“nico”,<span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//把’n’ ‘I’ ‘c’ ‘o’ ‘\0’赋给字符串</span>
s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span>,’x’<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//把五个x赋给字符串</span></pre></td></tr></table></div>

<p>把字符串清空的方法有三个：s=””;s.clear();s.erase();(我越来越觉得举例比说话让别人容易懂！)。<br />
string提供了很多函数用于插入（insert）、删除（erase）、替换（replace）、增加字符。<br />
先说增加字符（这里说的增加是在尾巴上），函数有 +=、append()、push_back()。举例如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code70'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39570"><td class="code" id="p395code70"><pre class="cpp" style="font-family:monospace;">s<span style="color: #000040;">+</span><span style="color: #000080;">=</span>str<span style="color: #008080;">;</span><span style="color: #666666;">//加个字符串</span>
s<span style="color: #000040;">+</span><span style="color: #000080;">=</span>”my name is jiayp”<span style="color: #008080;">;</span><span style="color: #666666;">//加个C字符串</span>
s<span style="color: #000040;">+</span><span style="color: #000080;">=</span>’a’<span style="color: #008080;">;</span><span style="color: #666666;">//加个字符</span>
&nbsp;
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span>str,<span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//不解释了 同前面的函数参数assign的解释</span>
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span>str,<span style="color: #0000dd;">2</span>,string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span><span style="color: #666666;">//不解释了</span>
&nbsp;
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span>“my name is jiayp”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span>“nico”,<span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span>,’x’<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
s.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>‘a’<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//这个函数只能增加单个字符 对STL熟悉的理解起来很简单</span></pre></td></tr></table></div>

<p>也许你需要在string中间的某个位置插入字符串，这时候你可以用insert()函数，这个函数需要你指定一个安插位置的索引，被插入的字符串将放在这个索引的后面。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code71'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39571"><td class="code" id="p395code71"><pre class="cpp" style="font-family:monospace;">    s.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>,”my name”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    s.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>这种形式的insert()函数不支持传入单个字符，这时的单个字符必须写成字符串形式(让人恶心)。既然你觉得恶心，那就不得不继续读下面一段话：为了插入单个字符，insert()函数提供了两个对插入单个字符操作的重载函数：insert(size_type index,size_type num,chart c)和insert(iterator pos,size_type num,chart c)。其中size_type是无符号整数，iterator是char*,所以，你这么调用insert函数是不行的：insert(0,1,’j’);这时候第一个参数将转换成哪一个呢？所以你必须这么写：insert((string::size_type)0,1,’j’)！第二种形式指出了使用迭代器安插字符的形式，在后面会提及。顺便提一下，string有很多操作是使用STL的迭代器的，他也尽量做得和STL靠近。<br />
删除函数erase()的形式也有好几种（真烦！），替换函数replace()也有好几个。举例吧：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code72'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39572"><td class="code" id="p395code72"><pre class="cpp" style="font-family:monospace;">string s<span style="color: #000080;">=</span>”il8n”<span style="color: #008080;">;</span>
s.<span style="color: #007788;">replace</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">2</span>,”nternationalizatio”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//从索引1开始的2个替换成后面的C_string</span>
s.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">13</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//从索引13开始往后全删除</span>
s.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">7</span>,<span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//从索引7开始往后删5个</span></pre></td></tr></table></div>

<p>2．6提取子串和字符串连接</p>
<p>题取子串的函数是：substr(),形式如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code73'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39573"><td class="code" id="p395code73"><pre class="cpp" style="font-family:monospace;">s.<span style="color: #007788;">substr</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//返回s的全部内容</span>
s.<span style="color: #007788;">substr</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">11</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//从索引11往后的子串</span>
s.<span style="color: #007788;">substr</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span>,<span style="color: #0000dd;">6</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//从索引5开始6个字符</span></pre></td></tr></table></div>

<p>把两个字符串结合起来的函数是+。（谁不明白请致电120）</p>
<p>2．7输入输出操作<br />
1．>> 从输入流读取一个string。<br />
2．<< 把一个string写入输出流。<br />
另一个函数就是getline(),他从输入流读取一行内容，直到遇到分行符或到了文件尾。</p>
<p>2．8搜索与查找<br />
查找函数很多，功能也很强大，包括了：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code74'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39574"><td class="code" id="p395code74"><pre class="cpp" style="font-family:monospace;">    find<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    rfind<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    find_first_of<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    find_last_of<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    find_first_not_of<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    find_last_not_of<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span></pre></td></tr></table></div>

<p>这些函数返回符合搜索条件的字符区间内的第一个字符的索引，没找到目标就返回npos。所有的函数的参数说明如下：<br />
第一个参数是被搜寻的对象。第二个参数（可有可无）指出string内的搜寻起点索引，第三个参数（可有可无）指出搜寻的字符个数。比较简单，不多说 不理解的可以向我提出，我再仔细的解答。当然，更加强大的STL搜寻在后面会有提及。<br />
最后再说说npos的含义，string::npos的类型是string::size_type,所以，一旦需要把一个索引与npos相比，这个索引值必须是string::size)type类型的，更多的情况下，我们可以直接把函数和npos进行比较（如：if(s.find(“jia”)==string::npos)）。</p>
<p>任何人对本文进行引用都要标明作者是Nicolai M.Josuttis 译者是侯捷/孟岩</p>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/string-hash-compare/" title="各种字符串Hash函数比较">各种字符串Hash函数比较</a></li><li><a href="http://www.byvoid.com/blog/cpp-fstream/" title="C++中fstream的用法">C++中fstream的用法</a></li><li><a href="http://www.byvoid.com/blog/thinking-in-delphi/" title="Thinking in Delphi：语言的变革">Thinking in Delphi：语言的变革</a></li><li><a href="http://www.byvoid.com/blog/c-string/" title="C语言字符串函数大全">C语言字符串函数大全</a></li><li><a href="http://www.byvoid.com/blog/vakuum-dev-note-02/" title="Vakuum开发笔记02 核心与安全问题">Vakuum开发笔记02 核心与安全问题</a></li><li><a href="http://www.byvoid.com/blog/fast-readfile/" title="探寻C++最快的读取文件的方案">探寻C++最快的读取文件的方案</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/cpp-string/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>各种字符串Hash函数比较</title>
		<link>http://www.byvoid.com/blog/string-hash-compare/</link>
		<comments>http://www.byvoid.com/blog/string-hash-compare/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 05:08:59 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[計算機科學]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[哈希]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[比较]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=286</guid>
		<description><![CDATA[常用的字符串Hash函数还有ELFHash，APHash等等，都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数，这些函数几乎... ]]></description>
			<content:encoded><![CDATA[<p>常用的字符串Hash函数还有ELFHash，APHash等等，都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数，这些函数几乎不可能找到碰撞。</p>
<p>常用字符串哈希函数有BKDRHash，APHash，DJBHash，JSHash，RSHash，SDBMHash，PJWHash，ELFHash等等。对于以上几种哈希函数，我对其进行了一个小小的评测。
</p>
<table border="1">
<col width="72" span="10" />
<tr height="19">
<td>Hash函数</td>
<td>数据1</td>
<td>数据2</td>
<td>数据3</td>
<td>数据4</td>
<td>数据1得分</td>
<td>数据2得分</td>
<td>数据3得分</td>
<td>数据4得分</td>
<td>平均分</td>
</tr>
<tr height="19">
<td>BKDRHash</td>
<td align="right">2</td>
<td align="right">0</td>
<td align="right">4774</td>
<td align="right">481</td>
<td align="right">96.55</td>
<td align="right">100</td>
<td align="right">90.95</td>
<td align="right">82.05</td>
<td align="right">92.64</td>
</tr>
<tr height="19">
<td>APHash</td>
<td align="right">2</td>
<td align="right">3</td>
<td align="right">4754</td>
<td align="right">493</td>
<td align="right">96.55</td>
<td align="right">88.46</td>
<td align="right">100</td>
<td align="right">51.28</td>
<td align="right">86.28</td>
</tr>
<tr height="19">
<td>DJBHash</td>
<td align="right">2</td>
<td align="right">2</td>
<td align="right">4975</td>
<td align="right">474</td>
<td align="right">96.55</td>
<td align="right">92.31</td>
<td align="right">0</td>
<td align="right">100</td>
<td align="right">83.43</td>
</tr>
<tr height="19">
<td>JSHash</td>
<td align="right">1</td>
<td align="right">4</td>
<td align="right">4761</td>
<td align="right">506</td>
<td align="right">100</td>
<td align="right">84.62</td>
<td align="right">96.83</td>
<td align="right">17.95</td>
<td align="right">81.94</td>
</tr>
<tr height="19">
<td>RSHash</td>
<td align="right">1</td>
<td align="right">0</td>
<td align="right">4861</td>
<td align="right">505</td>
<td align="right">100</td>
<td align="right">100</td>
<td align="right">51.58</td>
<td align="right">20.51</td>
<td align="right">75.96</td>
</tr>
<tr height="19">
<td>SDBMHash</td>
<td align="right">3</td>
<td align="right">2</td>
<td align="right">4849</td>
<td align="right">504</td>
<td align="right">93.1</td>
<td align="right">92.31</td>
<td align="right">57.01</td>
<td align="right">23.08</td>
<td align="right">72.41</td>
</tr>
<tr height="19">
<td>PJWHash</td>
<td align="right">30</td>
<td align="right">26</td>
<td align="right">4878</td>
<td align="right">513</td>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">43.89</td>
<td align="right">0</td>
<td align="right">21.95</td>
</tr>
<tr height="19">
<td>ELFHash</td>
<td align="right">30</td>
<td align="right">26</td>
<td align="right">4878</td>
<td align="right">513</td>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">43.89</td>
<td align="right">0</td>
<td align="right">21.95</td>
</tr>
</table>
<p>其中数据1为100000个字母和数字组成的随机串哈希冲突个数。数据2为100000个有意义的英文句子哈希冲突个数。数据3为数据1的哈希值与1000003(大素数)求模后存储到线性表中冲突的个数。数据4为数据1的哈希值与10000019(更大素数)求模后存储到线性表中冲突的个数。</p>
<p>经过比较，得出以上平均得分。平均数为平方平均数。可以发现，BKDRHash无论是在实际效果还是编码实现中，效果都是最突出的。APHash也是较为优秀的算法。DJBHash,JSHash,RSHash与SDBMHash各有千秋。PJWHash与ELFHash效果最差，但得分相似，其算法本质是相似的。</p>
<p>在信息修竞赛中，要本着易于编码调试的原则，个人认为BKDRHash是最适合记忆和使用的。</p>
<p>BYVoid原创，欢迎建议、交流、批评和指正。</p>
<p>附：各种哈希函数的C语言程序代码<br />
<span id="more-286"></span></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://www.byvoid.com/blog/wp-content/plugins/wp-codebox/wp-codebox.php?p=286&amp;download=Hash.c">Hash.c</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p28676"><td class="code" id="p286code76"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> SDBMHash<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #666666;">// equivalent to: hash = 65599*hash + (*str++);</span>
		hash <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">6</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">16</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> hash<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// RS Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> RSHash<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> b <span style="color: #000080;">=</span> <span style="color: #0000dd;">378551</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">63689</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		hash <span style="color: #000080;">=</span> hash <span style="color: #000040;">*</span> a <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		a <span style="color: #000040;">*</span><span style="color: #000080;">=</span> b<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// JS Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> JSHash<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">1315423911</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		hash <span style="color: #000040;">^</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&gt;&gt;</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// P. J. Weinberger Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> PJWHash<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> BitsInUnignedInt <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> <span style="color: #0000dd;">8</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> ThreeQuarters	<span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>BitsInUnignedInt  <span style="color: #000040;">*</span> <span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">/</span> <span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> OneEighth		<span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>BitsInUnignedInt <span style="color: #000040;">/</span> <span style="color: #0000dd;">8</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> HighBits		 <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #208080;">0xFFFFFFFF</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>BitsInUnignedInt <span style="color: #000040;">-</span> OneEighth<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash			 <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> test			 <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		hash <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> OneEighth<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>test <span style="color: #000080;">=</span> hash <span style="color: #000040;">&amp;</span> HighBits<span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			hash <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">^</span> <span style="color: #008000;">&#40;</span>test <span style="color: #000080;">&gt;&gt;</span> ThreeQuarters<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;</span> <span style="color: #008000;">&#40;</span>~HighBits<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// ELF Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> ELFHash<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> x	<span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		hash <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>x <span style="color: #000080;">=</span> hash <span style="color: #000040;">&amp;</span> 0xF0000000L<span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			hash <span style="color: #000040;">^</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">&gt;&gt;</span> <span style="color: #0000dd;">24</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			hash <span style="color: #000040;">&amp;</span><span style="color: #000080;">=</span> ~x<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// BKDR Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> BKDRHash<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> seed <span style="color: #000080;">=</span> <span style="color: #0000dd;">131</span><span style="color: #008080;">;</span> <span style="color: #666666;">// 31 131 1313 13131 131313 etc..</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		hash <span style="color: #000080;">=</span> hash <span style="color: #000040;">*</span> seed <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// DJB Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> DJBHash<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">5381</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		hash <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// AP Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> APHash<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> i<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #000040;">*</span>str<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>i <span style="color: #000040;">&amp;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			hash <span style="color: #000040;">^</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">7</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">^</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">^</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&gt;&gt;</span> <span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
		<span style="color: #008000;">&#123;</span>
			hash <span style="color: #000040;">^</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>~<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">11</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">^</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">^</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&gt;&gt;</span> <span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/cpp-string/" title="C++ string 用法详解">C++ string 用法详解</a></li><li><a href="http://www.byvoid.com/blog/usaco-552-hidden-passwords/" title="USACO 5.5.2 Hidden Passwords 隐藏口令  hidden">USACO 5.5.2 Hidden Passwords 隐藏口令  hidden</a></li><li><a href="http://www.byvoid.com/blog/c-string/" title="C语言字符串函数大全">C语言字符串函数大全</a></li><li><a href="http://www.byvoid.com/blog/vakuum-dev-note-02/" title="Vakuum开发笔记02 核心与安全问题">Vakuum开发笔记02 核心与安全问题</a></li><li><a href="http://www.byvoid.com/blog/fast-readfile/" title="探寻C++最快的读取文件的方案">探寻C++最快的读取文件的方案</a></li><li><a href="http://www.byvoid.com/blog/linux-cprogram-syscall/" title="Linux下C程序启动时的系统调用">Linux下C程序启动时的系统调用</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/string-hash-compare/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>USACO 5.5.2 Hidden Passwords 隐藏口令  hidden</title>
		<link>http://www.byvoid.com/blog/usaco-552-hidden-passwords/</link>
		<comments>http://www.byvoid.com/blog/usaco-552-hidden-passwords/#comments</comments>
		<pubDate>Sun, 31 Aug 2008 08:09:19 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[USACO]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[比较]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=259</guid>
		<description><![CDATA[O(N^2)的算法。但由于大数据都比较特殊，所以能很快过了。 由于是一个环，所以要把字符串在复制一遍放到末尾。 我采用C语言对字符串的描述方法，从0开始。 用i,j分别表示以i开头和以j开头... ]]></description>
			<content:encoded><![CDATA[<p><span id="more-259"></span>O(N^2)的算法。但由于大数据都比较特殊，所以能很快过了。</p>
<p>由于是一个环，所以要把字符串在复制一遍放到末尾。</p>
<p>我采用C语言对字符串的描述方法，从0开始。</p>
<p>用i,j分别表示以i开头和以j开头的两个长度为L的字符串。i=0，j=1。</p>
<p>比较字符串S[i]和S[j]的大小，如果S[i]>S[j]则i=j，否则j向后移c位，c表示S[i]和S[j]的最长相同前缀的长度或者为1，直到j≥n为止。i的值就是结果。</p>
<blockquote><p>Compiling&#8230;<br />
Compile: OK</p>
<p>Executing&#8230;<br />
   Test 1: TEST OK [0.000 secs, 3044 KB]<br />
   Test 2: TEST OK [0.000 secs, 3044 KB]<br />
   Test 3: TEST OK [0.022 secs, 3044 KB]<br />
   Test 4: TEST OK [0.011 secs, 3040 KB]<br />
   Test 5: TEST OK [0.011 secs, 3044 KB]<br />
   Test 6: TEST OK [0.000 secs, 3044 KB]<br />
   Test 7: TEST OK [0.000 secs, 3044 KB]<br />
   Test 8: TEST OK [0.022 secs, 3044 KB]<br />
   Test 9: TEST OK [0.000 secs, 3044 KB]<br />
   Test 10: TEST OK [0.011 secs, 3040 KB]<br />
   Test 11: TEST OK [0.022 secs, 3044 KB]<br />
   Test 12: TEST OK [0.000 secs, 3044 KB]<br />
   Test 13: TEST OK [0.022 secs, 3040 KB]<br />
   Test 14: TEST OK [0.011 secs, 3040 KB]</p>
<p>All tests OK.</p>
<p>Your program (&#8216;hidden&#8217;) produced all correct answers! This is your submission #10 for this problem. Congratulations! </p></blockquote>
<p><code lang="cpp" download="code.cpp"><br />
/*<br />
ID: cmykrgb1<br />
PROG: hidden<br />
LANG: C++<br />
*/</p>
<p>#include <iostream><br />
#include <fstream></p>
<p>using namespace std;</p>
<p>ofstream fo("hidden.out");</p>
<p>char S[200000];<br />
int L;</p>
<p>void init()<br />
{<br />
	freopen("hidden.in","r",stdin);<br />
	char c=10;<br />
	int k=0;<br />
	scanf("%d",&#038;L);<br />
	for (;;)<br />
	{<br />
		while (c==10 || c==13) c=getchar();<br />
		if (c==EOF)	break;<br />
		S[k++]=c;<br />
		c=getchar();<br />
	}<br />
	for (k=0;k<L;k++)<br />
		S[k+L]=S[k];<br />
	S[2*L]=0;<br />
}</p>
<p>void compare()<br />
{<br />
	int i=0,j=1,k,c,bigger;<br />
	while (j<L)<br />
	{<br />
		c=-1;bigger=0;<br />
		for (k=0;k<L;k++)<br />
		{<br />
			if (c!=-1 &#038;&#038; bigger!=0) break;<br />
			if (S[i+k]!=S[j+k] &#038;&#038; c==-1)<br />
				c=k;<br />
			if (bigger==0)<br />
			{<br />
				if (S[i+k]>S[j+k])<br />
					bigger=1;<br />
				else if (S[i+k]<S[j+k])<br />
					bigger=2;<br />
			}<br />
		}<br />
		if (bigger==1)<br />
		{<br />
			i=j++;<br />
		}<br />
		else<br />
			j+=c==0?1:c;<br />
	}<br />
	fo << (i==-1?0:i) << endl;<br />
}</p>
<p>int main()<br />
{<br />
	init();<br />
	compare();<br />
	fo.close();<br />
	return 0;<br />
}<br />
</code></p>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/string-hash-compare/" title="各种字符串Hash函数比较">各种字符串Hash函数比较</a></li><li><a href="http://www.byvoid.com/blog/usaco-434-letter-game/" title="USACO 4.3.4 Letter Game 字母游戏 lgame">USACO 4.3.4 Letter Game 字母游戏 lgame</a></li><li><a href="http://www.byvoid.com/blog/usaco-231-longest-prefix/" title="USACO 2.3.1 Longest Prefix 最长前缀">USACO 2.3.1 Longest Prefix 最长前缀</a></li><li><a href="http://www.byvoid.com/blog/fast-readfile/" title="探寻C++最快的读取文件的方案">探寻C++最快的读取文件的方案</a></li><li><a href="http://www.byvoid.com/blog/pku-3255/" title="pku 3255 Roadblocks">pku 3255 Roadblocks</a></li><li><a href="http://www.byvoid.com/blog/poi-2000-pow/" title="POI 2000 Repetitions 最长公共子串">POI 2000 Repetitions 最长公共子串</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/usaco-552-hidden-passwords/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
