﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Jonathan</title><link>http://www.cppblog.com/Jonathan/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 11 Apr 2026 09:31:14 GMT</lastBuildDate><pubDate>Sat, 11 Apr 2026 09:31:14 GMT</pubDate><ttl>60</ttl><item><title>String类</title><link>http://www.cppblog.com/Jonathan/archive/2006/04/11/5315.html</link><dc:creator>Jonathan</dc:creator><author>Jonathan</author><pubDate>Tue, 11 Apr 2006 12:35:00 GMT</pubDate><guid>http://www.cppblog.com/Jonathan/archive/2006/04/11/5315.html</guid><wfw:comment>http://www.cppblog.com/Jonathan/comments/5315.html</wfw:comment><comments>http://www.cppblog.com/Jonathan/archive/2006/04/11/5315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jonathan/comments/commentRss/5315.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jonathan/services/trackbacks/5315.html</trackback:ping><description><![CDATA[
		<p>//string.h<br />#ifndef STRING_H_<br />#define STRING_H_<br />#include &lt;iostream&gt;<br />#include &lt;cstring&gt;<br />#include &lt;cctype&gt;<br />#include &lt;cassert&gt;<br />#include &lt;cstddef&gt;<br />#include &lt;string&gt;<br />#include "auto_pointer.h"</p>
		<p>class String<br />{<br />private:<br /> size_t  _size;<br /> char *_string;<br /> void init (size_t , const char *);<br />public:<br /> String () { init (0, NULL); }<br /> String (const char * str) { init (strlen(str), str); }<br /> String (const String &amp; str) { init (str.size (), str.c_str());}<br /> ~String () { delete [] _string; }<br /> //member methods<br /> int count (char ch)const;<br /> size_t size ()const { return _size; }<br /> char * c_str ()const {return _string ;}<br /> const char * to_upper ()const;<br /> //assign operator<br /> String &amp; operator = (const char * str);<br /> String &amp; operator = (const String &amp; str);<br /> //overload operators<br /> bool operator == (const char *str)const {return strcmp (_string, str) == 0; }<br /> bool operator == (const String &amp;str)const {return strcmp (_string, str.c_str ()) == 0; }<br /> bool operator != (const String &amp; str)const { return strcmp (_string, str.c_str ()) != 0; }<br /> bool operator != (const char *str)const {return strcmp (_string, str) != 0; }<br /> bool operator &lt; (const char *str)const {return strcmp (_string, str) &lt; 0; } <br /> bool operator &lt; (const String &amp; str)const {return strcmp (_string, str.c_str ()) &lt; 0; }<br /> bool operator &gt; (const char *str)const {return strcmp (_string, str) &gt; 0; }<br /> bool operator &gt; (const String &amp; str)const {return strcmp (_string, str.c_str ()) &gt; 0; }<br /> String &amp;  operator += (const char *str);<br /> String  &amp; operator += (const String &amp; str);<br /> char &amp; operator [] (size_t i) { assert(i &gt;= 0 &amp;&amp; i &lt; _size); return _string[i]; }<br /> //friend methods<br /> friend std::ostream &amp; operator &lt;&lt; (std::ostream &amp; os, const String &amp; str);<br /> friend std::istream &amp; operator &gt;&gt; (std::istream &amp;is, String &amp; str);<br /> friend bool operator == (const char *cstr, const String &amp; sstr) {return sstr.operator == (cstr); }<br /> friend bool operator != (const char *cstr, const String &amp; sstr) {return sstr.operator != (cstr); }<br /> friend bool operator &lt; (const char *cstr, const String &amp; sstr) {return sstr.operator &lt;(cstr); }<br /> friend bool operator &gt; (const char *cstr, const String &amp; sstr) {return sstr.operator &gt;(cstr); }<br />};</p>
		<p>#endif<br />//string.cpp<br />#include "String.h"<br />#include &lt;cstring&gt;<br />#include &lt;iomanip&gt;<br />#pragma warning(disable : 4996)</p>
		<p>void String::init(size_t size, const char *str)<br />{<br /> _size = size;<br /> if (!str)<br /> {<br />  _string = new char [1];<br />  _string[0]  = '\0';<br /> }<br /> _string = new char[_size + 1];<br /> strncpy (_string, str, _size);<br /> _string[_size ] = '\0';<br /> //strcpy (_string, str);<br />}</p>
		<p>String &amp; String::operator = (const char *str)<br />{<br /> delete [] _string;<br /> init (strlen (str), str);std::cout &lt;&lt; this-&gt;_string &lt;&lt; "_";<br /> return *this;<br />}</p>
		<p>String &amp; String::operator = (const String &amp;str)<br />{<br /> if (*this == str)<br />  return *this;<br /> delete [] _string;<br /> init (str.size (), str.c_str ());<br /> return *this;<br />}</p>
		<p>String  &amp; String::operator +=(const char *str)<br />{<br /> String temp(*this);<br /> _size += strlen (str);<br /> _string = new char[_size + 1];<br /> strcpy (_string, temp.c_str ());<br /> //strcat (_string, str);<br /> strcpy (_string+temp.size (), str);<br /> return *this;<br />}</p>
		<p>String &amp; String::operator +=(const String &amp;str)<br />{<br /> String temp(*this);<br /> _size +=  str.size ();<br /> _string = new char[_size + 1];<br /> strcpy (_string, temp.c_str ());<br /> //strcat (_string , str.c_str ());<br /> strcpy (_string+temp.size (), str.c_str ());<br /> return *this;<br />}</p>
		<p>int String::count (char ch)const<br />{<br /> int cn = 0;<br /> for (size_t i = 0; i &lt; _size; i++)<br />  if (ch == tolower(_string[i]))<br />   cn++;<br /> return cn;<br />}</p>
		<p>const char * String::to_upper ()const<br />{<br /> size_t size = strlen (_string);<br /> char *temp = new char[size + 1]; <br /> size_t j = 0;<br /> for (size_t i = 0; i &lt; size; i++)<br />  if (isalpha(_string[i]) || _string[i] == ' ')<br />   if (isalpha (_string[i]))<br />    temp[j++] = toupper (_string[i]);<br />   else<br />    temp[j++] = _string[i];<br /> temp[j] = '\0';<br /> return temp;<br />}<br />std::ostream &amp; operator &lt;&lt; (std::ostream &amp; os, const String &amp; str)<br />{<br /> return os &lt;&lt; str.c_str ();<br />}</p>
		<p>std::istream &amp; operator &gt;&gt; (std::istream &amp; is, String &amp; str)<br />{<br /> const int limit_string_size = 50;<br /> char Inbuf [limit_string_size];</p>
		<p> //is.read (Inbuf, limit_string_size);<br /> //is &gt;&gt; setw (limit_string_size) &gt;&gt; Inbuf;<br /> is.getline (Inbuf, limit_string_size-1, '\n');<br /> /*if (is)<br /> {<br />  while (is.get () == '\n')<br />   break;<br />  Inbuf[limit_string_size-1] = '\0';<br /> }*/<br /> //is &gt;&gt; Inbuf;<br /> str = Inbuf;<br /> return is;<br />}</p>
<img src ="http://www.cppblog.com/Jonathan/aggbug/5315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jonathan/" target="_blank">Jonathan</a> 2006-04-11 20:35 <a href="http://www.cppblog.com/Jonathan/archive/2006/04/11/5315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>list类</title><link>http://www.cppblog.com/Jonathan/archive/2006/04/11/5314.html</link><dc:creator>Jonathan</dc:creator><author>Jonathan</author><pubDate>Tue, 11 Apr 2006 12:33:00 GMT</pubDate><guid>http://www.cppblog.com/Jonathan/archive/2006/04/11/5314.html</guid><wfw:comment>http://www.cppblog.com/Jonathan/comments/5314.html</wfw:comment><comments>http://www.cppblog.com/Jonathan/archive/2006/04/11/5314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jonathan/comments/commentRss/5314.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jonathan/services/trackbacks/5314.html</trackback:ping><description><![CDATA[
		<p>//头文件<br />#ifndef MYLIST_H_<br />#define MYLIST_H_<br />#include &lt;iostream&gt;</p>
		<p>//declarations<br />template &lt;typename elemType&gt;<br />class Mylist_item<br />{<br />private:<br /> elemType _value;<br /> Mylist_item *_next;<br />public:<br /> Mylist_item (elemType value, Mylist_item * item = 0);<br /> ~Mylist_item () { }<br /> elemType Value () {return _value; }              //return the value of the node<br /> Mylist_item * Next () { return _next; }               //return the pointer to the next node<br /> void next (Mylist_item *ptr) { _next = ptr; }<br /> void set_value (elemType value ) { _value = value; }<br />};</p>
		<p>template &lt;typename elemType&gt;<br />class Mylist<br />{<br />private:<br /> Mylist_item&lt;elemType&gt; *_at_front;                  //pointer to the head<br /> Mylist_item&lt;elemType&gt; *_at_end;                   //pointer to the tail<br /> Mylist_item&lt;elemType&gt; *_current;                   //pointer to the current element<br /> int _size;<br /> //renew the size<br /> void bump_up_size () { ++_size; }<br /> void bump_down_size () { --_size; }<br />public:<br /> Mylist () : _at_front (0), _at_end (0), _size (0) { }<br /> Mylist (const Mylist &amp; rhs);<br /> ~Mylist () { }<br /> Mylist &amp; operator = (const  Mylist  &amp; rhs);</p>
		<p> //operators overloading<br /> Mylist_item&lt;elemType&gt; * operator ++ ();<br /> //Mylist_item&lt;elemType&gt; *operator ++ ();</p>
		<p> //sorting function (default in ascending order<br /> void sort (Mylist_item&lt;elemType&gt; *begin, Mylist_item&lt;elemType&gt; *end);</p>
		<p> //insertion functions, if the Mylist is full, do nothing</p>
		<p> //insert the value to the back of ptr<br /> void insert (Mylist_item&lt;elemType&gt; *ptr, elemType value);<br /> //insert the value to the front of the Mylist<br /> void insert_front (elemType value);<br /> //insert the value to the end of the Mylist<br /> void insert_end (elemType value);<br /> //insert the whole Mylist: rhs to the end of the current Mylist<br /> void insert_all (const Mylist &amp; rhs);</p>
		<p> //element removing functions,  if the Mylist is empty , do nothing</p>
		<p> //remove all the elements of the Mylist equal to the value and return the numbers of removed elements<br /> int remove (elemType value);<br /> //remove all the elements of the Mylist<br /> void remove_all ();<br /> //remove the front element of the Mylist<br /> void remove_front ();</p>
		<p> //find the value that given, if successful, return the pointer to the element, or return null<br /> Mylist_item&lt;elemType&gt; * find (elemType value, Mylist_item&lt;elemType&gt; *start = 0);<br /> <br /> //display all the elements of the Mylist on screen<br /> void display (std::ostream &amp; os = std::cout)const;</p>
		<p> //concat the given Mylist to the current Mylist<br /> void concat (const Mylist &amp; rhs);<br /> Mylist  concat_copy (const Mylist &amp;rhs);</p>
		<p> // reverse the Mylist, front to end<br /> void reverse ();<br /> Mylist reverse_copy ();</p>
		<p> //iterators<br /> Mylist_item&lt;elemType&gt; * init_iter (Mylist_item&lt;elemType&gt; *it = 0);<br /> Mylist_item&lt;elemType&gt; * next_iter ();</p>
		<p>};</p>
		<p>//definitions<br />template &lt;typename elemType&gt;<br />Mylist_item&lt;elemType&gt;::Mylist_item(elemType value, Mylist_item&lt;elemType&gt; *item)<br />{<br /> _value = value;<br /> if (!item)<br />  _next = 0;<br /> else<br /> {<br />  _next = item-&gt;Next ();<br />  item-&gt;_next = this;<br /> }<br />}</p>
		<p>template &lt;typename elemType&gt;<br />Mylist&lt;elemType&gt;::Mylist (const Mylist &amp; rhs): _at_front (0), _at_end (0)<br />{<br /> insert_all (rhs);<br />}</p>
		<p>template &lt;typename elemType&gt;<br />Mylist&lt;elemType&gt; &amp; Mylist&lt;elemType&gt;::operator =(const Mylist&lt;elemType&gt; &amp;rhs)<br />{<br /> if (this == &amp; rhs)<br />  return *this;<br /> remove_all ();<br /> insert_all (rhs);<br /> return *this;<br />}</p>
		<p>template &lt;typename elemType&gt;<br />Mylist_item&lt;elemType&gt; * Mylist&lt;elemType&gt;::operator ++ ()<br />{<br /> return next_iter ();<br />}</p>
		<p>/*template &lt;typename elemType&gt;<br />Mylist_item &lt;elemType&gt; * Mylist&lt;elemType&gt;::operator ++ ()<br />{<br /> Mylist_item&lt;elemType&gt; * temp = this;<br /> this = next_iter ();<br /> return temp;<br />}*/</p>
		<p>template &lt;typename elemType&gt;<br />Mylist_item&lt;elemType&gt; * Mylist&lt;elemType&gt;::init_iter (Mylist_item&lt;elemType&gt; *it)<br />{<br /> return _current = it ? _current : _at_front;<br />}</p>
		<p>template &lt;typename elemType&gt;<br />Mylist_item&lt;elemType&gt; * Mylist&lt;elemType&gt;::next_iter()<br />{<br /> Mylist_item&lt;elemType&gt; * temp = _current ? _current = _current-&gt;Next () : _current;<br /> return temp;<br />}</p>
		<p>template &lt;typename elemType&gt;<br />void Mylist&lt;elemType&gt;::reverse ()<br />{<br /> Mylist_item&lt;elemType&gt; *ptr = _at_front;<br /> Mylist_item&lt;elemType&gt; *pre = 0;<br /> _at_front = _at_end;<br /> _at_end = ptr;<br /> while (ptr != _at_front)<br /> {<br />  Mylist_item&lt;elemType&gt; *temp = ptr-&gt;Next ();<br />  ptr-&gt;next (pre);<br />  pre = ptr;<br />  ptr = temp;<br /> }<br />}</p>
		<p>template &lt;typename elemType&gt;<br />Mylist&lt;elemType&gt; Mylist&lt;elemType&gt;::reverse_copy ()<br />{<br /> Mylist&lt;elemType&gt;new_list;<br /> Mylist_item&lt;elemType&gt; *ptr = _at_front;<br /> for (; ptr ; ptr = ptr-&gt;Next ())<br />  new_list.insert_front (ptr-&gt;Value ());<br /> return new_list;<br />}</p>
		<p>template &lt;typename elemType&gt;<br />void Mylist&lt;elemType&gt;::concat(const Mylist&lt;elemType&gt; &amp;rhs)<br />{<br /> Mylist_item&lt;elemType&gt; * temp = rhs._at_front;<br /> while (temp)<br /> {<br />  insert_end (temp-&gt;Value ());<br />  temp = temp-&gt;Next ();<br /> }<br />}</p>
		<p>template &lt;typename elemType&gt;<br />Mylist&lt;elemType&gt; Mylist&lt;elemType&gt;::concat_copy (const Mylist&lt;elemType&gt; &amp; rhs)<br />{<br /> Mylist&lt;elemType&gt;new_list;<br /> Mylist_item&lt;elemType&gt; *ptr = _at_front;<br /> while (ptr)<br /> {<br />  new_list.insert_end (ptr-&gt;Value ());<br />  ptr = ptr-&gt;Next ();<br /> }<br /> for (ptr = rhs._at_front; ptr; ptr = ptr-&gt;Next ())<br />  new_list.insert_end (ptr-&gt;Value ());<br /> return new_list;<br />}</p>
		<p>template &lt;typename elemType&gt;<br />void Mylist&lt;elemType&gt;::display(std::ostream &amp;os) const<br />{<br /> os &lt;&lt; " \n( " &lt;&lt; _size &lt;&lt; " ) ( ";<br /> Mylist_item&lt;elemType&gt; * ptr = _at_front;<br /> while (ptr)<br /> {<br />  os &lt;&lt; ptr-&gt;Value () &lt;&lt; " ";<br />  ptr = ptr-&gt;Next ();<br /> }<br />}</p>
		<p>template &lt;typename elemType&gt;<br />Mylist_item&lt;elemType&gt; * Mylist &lt;elemType&gt;::find(elemType value, Mylist_item&lt;elemType&gt; *start)<br />{<br /> Mylist_item&lt;elemType&gt; *ptr = start ?start : _at_front;<br /> while (ptr)<br /> {<br />  if (ptr-&gt;Value () == value)<br />   break;<br />  ptr = ptr-&gt;Next ();<br /> }<br /> return ptr;<br />}</p>
		<p>template &lt;typename elemType&gt;<br />int Mylist&lt;elemType&gt;::remove(elemType value)<br />{<br /> Mylist_item&lt;elemType&gt; *ptr = _at_front;<br /> int count = 0;<br /> while (ptr &amp;&amp; ptr-&gt;Value () == value)<br /> {<br />  ptr = ptr-&gt;Next ();<br />  remove_front ();<br />  ++count;<br /> }<br /> if (!ptr)<br />  return count;<br /> Mylist_item&lt;elemType&gt; * pre = ptr;<br /> ptr = ptr-&gt;Next ();<br /> while (ptr)<br /> {<br />  if (ptr-&gt;Value () == value)<br />  {<br />   if (_current == ptr)<br />    _current = ptr-&gt;Next ();<br />   pre-&gt;next (ptr-&gt;Next ());<br />   ++count;<br />   delete ptr;<br />   bump_down_size ();<br />   ptr = pre-&gt;Next ();<br />  }<br />  else<br />  {<br />   pre = ptr;<br />   ptr = ptr-&gt;Next ();<br />  }<br /> }<br /> return count;<br />}</p>
		<p>template &lt;typename elemType&gt;<br />void Mylist&lt;elemType&gt;::remove_front ()<br />{<br /> if (_at_front)<br /> {<br />  Mylist_item&lt;elemType&gt; * temp = _at_front;<br />  if (_current == _at_front)<br />   _current = _at_front-&gt;Next ();<br />  _at_front = _at_front-&gt;Next ();<br />  bump_down_size ();<br />  delete temp;<br /> }<br />}</p>
		<p>template &lt;typename elemType&gt;<br />void Mylist&lt;elemType&gt;::remove_all ()<br />{<br /> while (_at_front)<br />  remove_front ();<br /> _size = 0;<br /> _at_front = _at_end = 0;<br />}</p>
		<p>template &lt;typename elemType&gt;<br />void Mylist&lt;elemType&gt;::insert(Mylist_item&lt;elemType&gt; *ptr, elemType value)<br />{<br /> if (!ptr)<br />  insert_front (value);<br /> else<br /> {<br />  bump_up_size ();<br />  new Mylist_item&lt;elemType&gt;(value, ptr);<br /> }<br />}</p>
		<p>template &lt;typename elemType&gt;<br />void Mylist&lt;elemType&gt;::insert_front(elemType value)<br />{<br /> Mylist_item&lt;elemType&gt; *ptr = new Mylist_item&lt;elemType&gt; (value);<br /> if (!_at_front )<br />  _at_front = _at_end = ptr;<br /> else<br /> {<br />  ptr-&gt;next (_at_front);<br />  _at_front = ptr;<br /> }<br /> bump_up_size ();<br />}</p>
		<p>template &lt;typename elemType&gt;<br />void Mylist&lt;elemType&gt;::insert_end(elemType value)<br />{<br /> Mylist_item&lt;elemType&gt; *ptr = new Mylist_item&lt;elemType&gt; (value);<br /> if (!_at_end)<br />  _at_front = _at_end = ptr;<br /> else                    //_at_end = new Mylist_item&lt;elemType&gt; (value, _at_front);<br /> {<br />  _at_end-&gt;next (ptr);<br />  _at_end = ptr;<br /> }<br /> bump_up_size ();<br />}</p>
		<p>template &lt;typename elemType&gt;<br />void Mylist&lt;elemType&gt;::insert_all(const Mylist&lt;elemType&gt; &amp;rhs)<br />{<br /> Mylist_item&lt;elemType&gt; *ptr = rhs._at_front;<br /> while (ptr)<br /> {<br />  insert_end (ptr-&gt;Value ());<br />  ptr = ptr-&gt;Next ();<br /> }<br />}<br />#endif<br /><br />//main () 函数<br /><br />#include &lt;iostream&gt;<br />#include "Mylist.h"</p>
		<p>int main()<br />{<br /> using std::cout;<br /> using std::endl;</p>
		<p> Mylist&lt;int&gt;mylist;</p>
		<p> for (int i = 0; i &lt; 10; ++i)<br /> {<br />  mylist.insert_front (i);<br />  mylist.insert_end (i);<br /> }</p>
		<p> cout &lt;&lt; "\nUse of init_iter() and next_iter () "<br />  &lt;&lt; " to iterater across each Mylist item:\n";</p>
		<p> Mylist_item&lt;int&gt; *iter;<br /> //for (iter = mylist.init_iter (); iter; iter = mylist.next_iter ())<br /> for (iter = mylist.init_iter (); iter; iter = mylist++)<br />  cout &lt;&lt; iter-&gt;Value () &lt;&lt; " ";</p>
		<p> cout &lt;&lt; "\nUse of copy constructor\n";</p>
		<p> Mylist&lt;int&gt; mylist2 (mylist);<br /> mylist.remove_all ();</p>
		<p> for (iter = mylist2.init_iter (); iter; iter = mylist2.next_iter ())<br />  cout &lt;&lt; iter-&gt;Value () &lt;&lt; " ";</p>
		<p> cout &lt;&lt; " \nUse of copy assignment operator\n";<br /> mylist = mylist2;</p>
		<p> for (iter = mylist.init_iter (); iter; iter = mylist.next_iter ())<br />  cout &lt;&lt; iter-&gt;Value () &lt;&lt; " ";<br /> cout &lt;&lt;endl;</p>
		<p> cout &lt;&lt; "\nUse of reverse_copy function:\n";<br /> Mylist&lt;int&gt;mylist3 = mylist.reverse_copy ();</p>
		<p> for (iter = mylist3.init_iter (); iter; iter = mylist3.next_iter ())<br />  cout &lt;&lt; iter-&gt;Value () &lt;&lt; " ";</p>
		<p> cout &lt;&lt; "\nUse of concat_copy function:\n";<br /> mylist.remove (3);<br /> mylist.insert (mylist.init_iter (),16);<br /> mylist2 = mylist3.concat_copy (mylist);<br /> mylist2.display ();<br /> <br /> return 0;<br />}</p>
<img src ="http://www.cppblog.com/Jonathan/aggbug/5314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jonathan/" target="_blank">Jonathan</a> 2006-04-11 20:33 <a href="http://www.cppblog.com/Jonathan/archive/2006/04/11/5314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用c++编写的n维网格</title><link>http://www.cppblog.com/Jonathan/archive/2006/04/11/5313.html</link><dc:creator>Jonathan</dc:creator><author>Jonathan</author><pubDate>Tue, 11 Apr 2006 12:29:00 GMT</pubDate><guid>http://www.cppblog.com/Jonathan/archive/2006/04/11/5313.html</guid><wfw:comment>http://www.cppblog.com/Jonathan/comments/5313.html</wfw:comment><comments>http://www.cppblog.com/Jonathan/archive/2006/04/11/5313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jonathan/comments/commentRss/5313.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jonathan/services/trackbacks/5313.html</trackback:ping><description><![CDATA[
		<p>#ifndef N_GRID_H_<br />#define N_GRID_H_<br />#include &lt;cassert&gt;<br />#include &lt;iostream&gt;</p>
		<p>template &lt;typename Type, int N&gt;<br />class N_Grid<br />{<br />public:<br /> //constructors and destructors<br /> N_Grid ();<br /> N_Grid (int size);<br /> N_Grid (const N_Grid&lt;Type, N&gt; &amp; );<br /> ~N_Grid ();<br /> //member methods<br /> N_Grid&lt;Type, N&gt; &amp; operator = (const N_Grid&lt;Type, N&gt; &amp; );<br /> void resize (int size );<br /> N_Grid&lt;Type, N-1&gt; &amp; operator [] (int i);<br /> const N_Grid&lt;Type, N-1&gt; &amp; operator [] (int i)const ;<br /> void print (std::ostream &amp; os = std::cout)const;<br /> int get_size ()const { return _size; }<br /> static const int _Default_size = 10;<br />protected:<br /> void copy_from (const N_Grid&lt;Type, N&gt; &amp; ); <br /> int _size;<br /> N_Grid&lt;Type, N-1&gt; *_elem;<br />};<br />//definitions</p>
		<p>template &lt;typename Type, int N&gt;<br />N_Grid&lt;Type, N&gt;::N_Grid(): _size (_Default_size)<br />{<br /> _elem = new N_Grid&lt;Type, N-1&gt; [_size];<br />}</p>
		<p>template &lt;typename Type, int N&gt;<br />N_Grid&lt;Type, N&gt;::N_Grid(int size) : _size (size)<br />{<br /> _elem = new N_Grid&lt;Type, N-1&gt; [_size];<br /> //Allocate the array above calls the 0-argument<br /> //constructor for the N_Grid&lt;Type, N-1&gt;, which <br /> //constructs it with the default size.<br /> for (int i = 0; i &lt; _size; i ++)<br />  _elem[i].resize (_size);<br />}</p>
		<p>template &lt;typename Type, int N&gt;<br />N_Grid&lt;Type, N&gt;::N_Grid(const N_Grid&lt;Type,N&gt; &amp; n_grid)<br />{<br /> copy_from (n_grid);<br />}</p>
		<p>template &lt;typename Type, int N&gt;<br />N_Grid&lt;Type, N&gt;::~N_Grid ()<br />{<br /> delete [] _elem;<br />}</p>
		<p>template &lt;typename Type, int N&gt;<br />void N_Grid&lt;Type, N&gt;::copy_from(const N_Grid&lt;Type,N&gt; &amp; n_grid)<br />{<br /> _size = n_grid._size;<br /> _elem = new N_Grid&lt;Type, N-1&gt; [_size];<br /> for (int i = 0; i &lt; _size; i++)<br />  _elem[i] = n_grid._elem [i];<br />}</p>
		<p>template &lt;typename Type, int N&gt;<br />N_Grid&lt;Type, N&gt; &amp; N_Grid&lt;Type, N&gt;::operator =(const N_Grid&lt;Type,N&gt; &amp; n_grid)<br />{<br /> if (this == &amp;n_grid)<br />  return *this;<br /> delete [] _elem;<br /> copy_from (n_grid);<br /> return *this;<br />}</p>
		<p>template &lt;typename Type, int N&gt;<br />void N_Grid&lt;Type, N&gt;::resize(int size)<br />{<br /> N_Grid&lt;Type, N&gt; temp (*this);<br /> _size = size;<br /> _elem = new N_Grid&lt;Type, N-1&gt; [_size];<br /> for (int i = 0; i &lt; _size &amp;&amp; i &lt; temp._size; i++)<br /> {<br />  _elem[i] = temp._elem[i];<br />  //risize the nested Grid elements recursively<br />  _elem[i].resize (_size);<br /> }<br />}</p>
		<p>template &lt;typename Type, int N&gt;<br />N_Grid&lt;Type, N-1&gt; &amp; N_Grid&lt;Type, N&gt;::operator [](int i)<br />{<br /> assert (i &gt;= 0 &amp;&amp; i &lt; _size);<br /> return _elem[i];<br />}</p>
		<p>template &lt;typename Type, int N&gt;<br />const N_Grid&lt;Type, N-1&gt; &amp; N_Grid&lt;Type, N&gt;::operator [](int i) const<br />{<br /> assert (i &gt;= 0 &amp;&amp; i &lt; _size);<br /> return _elem[i];<br />}</p>
		<p>template &lt;typename Type, int N&gt;<br />void N_Grid&lt;Type, N&gt;::print(std::ostream &amp;os = std::cout) const<br />{<br /> for (int i = 0; i &lt; _size ; i++)<br />  _elem[i].print (); <br /> os &lt;&lt; '\n';<br />}</p>
		<p>template &lt;typename Type&gt;<br />class N_Grid&lt;Type, 1&gt;<br />{<br />public:<br /> //constructors and destructors<br /> N_Grid ();<br /> N_Grid (int size);<br /> N_Grid (const N_Grid&lt;Type, 1&gt; &amp; );<br /> ~N_Grid ();<br /> //member methods<br /> N_Grid&lt;Type, 1&gt; &amp; operator = (const N_Grid&lt;Type, 1&gt; &amp; );<br /> void resize (int size );<br /> N_Grid&lt;Type, 1&gt; &amp; operator [] (int i);<br /> const N_Grid&lt;Type, 1&gt; &amp; operator [] (int i)const ;<br /> void print (std::ostream &amp; os = std::cout)const;<br /> int get_size ()const { return _size; }<br /> static const int _Default_size = 10;<br />protected:<br /> void copy_from (const N_Grid&lt;Type, 1&gt; &amp; ); <br /> int _size;<br /> N_Grid&lt;Type, 1&gt; *_elem;<br />};<br />template &lt;typename Type&gt;<br />N_Grid&lt;Type, 1&gt;::N_Grid() : _size (_Default_size)<br />{<br /> _elem = new Type [_size];<br />}</p>
		<p>template &lt;typename Type&gt;<br />N_Grid&lt;Type, 1&gt;::N_Grid(int size) : _size (size)<br />{<br /> _elem = new Type [_size];<br />}</p>
		<p>template &lt;typename Type&gt;<br />N_Grid&lt;Type, 1&gt;::N_Grid(const N_Grid&lt;Type, 1&gt; &amp; grid)<br />{<br /> copy_from (grid);<br />}</p>
		<p>template &lt;typename Type&gt;<br />N_Grid&lt;Type, 1&gt;::~N_Grid()<br />{<br /> delete [] _elem;<br />}</p>
		<p>template &lt;typename Type&gt;<br />void N_Grid&lt;Type, 1&gt;::copy_from(const N_Grid&lt;Type,1&gt; &amp; grid)<br />{<br /> _size = grid._size;<br /> _elem = new Type [_size];<br /> for (int i = 0; i &lt; _size; i++)<br />  _elem[i] = grid._elem[i];<br />}</p>
		<p>template &lt;typename Type&gt;<br />N_Grid&lt;Type, 1&gt; &amp; N_Grid&lt;Type, 1&gt;::operator =(const N_Grid&lt;Type,1&gt; &amp; grid)<br />{<br /> if (this == &amp;grid)<br />  return *this;<br /> delete [] _elem;<br /> copy_from (grid);<br /> return *this;<br />}</p>
		<p>template &lt;typename Type&gt;<br />void N_Grid&lt;Type, 1&gt;::resize(int size)<br />{<br /> N_Grid&lt;Type, 1&gt; temp (*this);<br /> _size = size;<br /> _elem = new Type[_size];<br /> for (int i = 0; i &lt; _size; i++)<br />  _elem[i] = temp._elem[i];<br />}</p>
		<p>template &lt;typename Type&gt;<br />N_Grid&lt;Type, 1&gt; &amp; N_Grid&lt;Type, 1&gt;::operator [](int i)<br />{<br /> assert (i &gt;= 0 &amp;&amp; i &lt; _size);<br /> return _elem[i];<br />}</p>
		<p>template &lt;typename Type&gt;<br />const N_Grid&lt;Type, 1&gt; &amp; N_Grid&lt;Type, 1&gt;::operator [](int i) const<br />{<br /> assert (i &gt;= 0 &amp;&amp; i &lt; _size);<br /> return _elem[i];<br />}</p>
		<p>template &lt;typename Type&gt;<br />void N_Grid&lt;Type, 1&gt;::print(std::ostream &amp;os = std::cout) const<br />{<br /> for (int i = 0; i &lt; _size; i++)<br />   os &lt;&lt; _size;<br /> os &lt;&lt; '\n';<br />}<br />#endif</p>
<img src ="http://www.cppblog.com/Jonathan/aggbug/5313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jonathan/" target="_blank">Jonathan</a> 2006-04-11 20:29 <a href="http://www.cppblog.com/Jonathan/archive/2006/04/11/5313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>郁闷</title><link>http://www.cppblog.com/Jonathan/archive/2006/04/11/5312.html</link><dc:creator>Jonathan</dc:creator><author>Jonathan</author><pubDate>Tue, 11 Apr 2006 12:26:00 GMT</pubDate><guid>http://www.cppblog.com/Jonathan/archive/2006/04/11/5312.html</guid><wfw:comment>http://www.cppblog.com/Jonathan/comments/5312.html</wfw:comment><comments>http://www.cppblog.com/Jonathan/archive/2006/04/11/5312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jonathan/comments/commentRss/5312.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jonathan/services/trackbacks/5312.html</trackback:ping><description><![CDATA[怎么边学边忘呢？好郁闷呀！刚刚看过模板和STL还有泛型算法的，但是现在又不会了，真是郁闷呀，<br />现在真的感觉很茫然，都不知道接下来应该如何学习C++了，又加上时间比较紧张，没有同样喜欢的人互相勉励，真的是举步维艰呀<img src ="http://www.cppblog.com/Jonathan/aggbug/5312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jonathan/" target="_blank">Jonathan</a> 2006-04-11 20:26 <a href="http://www.cppblog.com/Jonathan/archive/2006/04/11/5312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的c++学习</title><link>http://www.cppblog.com/Jonathan/archive/2006/04/03/4956.html</link><dc:creator>Jonathan</dc:creator><author>Jonathan</author><pubDate>Mon, 03 Apr 2006 13:11:00 GMT</pubDate><guid>http://www.cppblog.com/Jonathan/archive/2006/04/03/4956.html</guid><wfw:comment>http://www.cppblog.com/Jonathan/comments/4956.html</wfw:comment><comments>http://www.cppblog.com/Jonathan/archive/2006/04/03/4956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jonathan/comments/commentRss/4956.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jonathan/services/trackbacks/4956.html</trackback:ping><description><![CDATA[前段时间一直潜心看《C++ primer》，到现在为止终于接近尾声了，但说实话感觉并没有掌握多少，这本书确实是重在解析呀，有时候感觉都看晕了，但是我还是一直坚持着，现在感觉这本书确实很好，我还要再仔细研读，虽然他有些方面还是不完善吧，这是我的个人观点，比如有些句子就比较艰涩难懂，还有就是对于多重继承和io讲的不是很详细，必须结合别的书籍才能理解，别的有些东西就讲得比较繁琐，还有就是习题太少了，例题也不太好，总是用同一个例子。<img src ="http://www.cppblog.com/Jonathan/aggbug/4956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jonathan/" target="_blank">Jonathan</a> 2006-04-03 21:11 <a href="http://www.cppblog.com/Jonathan/archive/2006/04/03/4956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一篇学习C++的初学者不得不看得好文章《引用》</title><link>http://www.cppblog.com/Jonathan/archive/2006/03/13/4107.html</link><dc:creator>Jonathan</dc:creator><author>Jonathan</author><pubDate>Mon, 13 Mar 2006 13:52:00 GMT</pubDate><guid>http://www.cppblog.com/Jonathan/archive/2006/03/13/4107.html</guid><wfw:comment>http://www.cppblog.com/Jonathan/comments/4107.html</wfw:comment><comments>http://www.cppblog.com/Jonathan/archive/2006/03/13/4107.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Jonathan/comments/commentRss/4107.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jonathan/services/trackbacks/4107.html</trackback:ping><description><![CDATA[<A href="http://www.ttian.net/forum/viewtopic.php?pid=12441">http://www.ttian.net/forum/viewtopic.php?pid=12441</A><BR>上面的是文章的出处， 下面是我从那个网页的拷贝：<BR>虽然TTIAN里搞开发的人少之又少，但是这里毕竟是我网上唯一的家，所以有什么想法还是发到这里比较合适。我不准备说C++的任何技术，只想说明如何成为C++高手，只想告诉你什么书可以解决你的什么问题！<BR minmax_bound="true">________________________________________________________<BR minmax_bound="true"><BR minmax_bound="true">&nbsp; &nbsp; &nbsp; 经过十分漫长的C++学习过程，我总算完成了我自己的C++心愿，看完了我想看的所有C++书籍，回顾我C++的整个学习过程，颇有一些心得和经验，希望与各位分享，也希望给正处在摸索学习阶段的XDJM一点学习参考。<BR minmax_bound="true">&nbsp; &nbsp; 首先看看我第一次接触编程语言，唔，那可能要追述上到世纪，在我小学4年纪的时候第一次接触到BASIC，那个时候学习这个东西完全是为了要爸爸给我买一台386，没想到的是，BASIC开启了我对于计算机的一切兴趣与追求。5年纪的时候参加少年的计算机奥赛，我用BASIC写的一个彩色立体可旋转移动的正方体拿了一个铜牌，从此计算机编程成为了最大的爱好，现在我还保留着源代码，是保存在一盘普通单放机的磁带上的，我估计很少有人用过录音机和串口的转换器吧，呵。我用BASIC写的第二个大程序是给我妈妈用的财务程序，初中二年纪的时候，我妈妈在单位做出纳，我总看到妈妈每天晚上拿个计算机算一堆表，所以我写了这个程序帮助妈妈快速完成她的工作，其实我的根本目的是为了一台打印机，因为这个程序，生成了简单的报表，她可以直接打印，当然为了这个便利，她必须花钱给我买一台当时还算价值不低的打印机。不过现在回顾起来，BASIC虽然是我编程的第一位启蒙老师，但是在我开始C++的学习之后，他确实使我我思想上产生了很大的困绕，主要是OOP思想，我花费了将近1年多的时间才真正体会到什么是OO！<BR minmax_bound="true">&nbsp; &nbsp; 到了大学，我才真正开始系统的学习编程。在此之间走过一些歪路，比如高中的时候研究HACKING，之所以说学习hacking是条歪路，原因很简单，因为研究到一定的程度，没有十分稳固的编程基础，根本的无法继续深入学习。中国**联盟解体前，位列第三的kender给了我这方面很大的打击，从此我就退出了，从此对于hacking我就不闻不问，从此看到那些下三烂的货色也要学hacking，我就感到可笑。第一次接触的是C，没什么好说的，我C学的不好，因为我大二的时候经商去了，而且我觉得C能做的，我用BASIC都能做到，为什么要学C？当然那个时候我成绩真是北大的BBS...然后接触到的就是C++，教材的钱能的《C++程序设计》,这本书其实还是很不错的，不过很多看了两本名著的朋友都对这本书嗤之以鼻，也许是我天生很笨，在我看完了《C++PRIMER》后还经常番看《C++程序设计》。《C++程序设计》虽然出书的时候ANSI C++还没有确定下来，不过它还是含盖了C++所有语法，建议对C++感兴趣却又没有任何基础的人先从这本书开始，简单而高效，不要认为人家一上来就看《C++ PRIMER》或是《the c++ programming language》就觉得自己的档次很低，你要确信，你肯定能超过他！这本书课后习题在我看来是典型的结构化编程，即使到了CLASS，也全部可以用STRUCT代替。不过在这个阶段做习题十分必要，用处我不想敲了，推荐使用的编译器就是书中所说到的编译器（我忘记叫什么了:P)看完之后，如果你想说C++很简单的话，建议你在看完了《C++ PRIMER》或是《the c++ programming language》之后再说。这两本书都是基于标准C++的，十分苛求的说，后者对标准的兼容性稍差:)。对这两本书，我的看法是，如果你确实想仔细的学习，建议你看《C++ PRIMER》，如果你想跳过我将要写到的下面两本书的话，建议你看《the c++ programming language》。对这两本书，前者最高到中文第三版，因为第四版，后者到特别版。对于前者，我看后的感觉是它的优点在于解析，特别是函数，类，模板的解析，但是它并没有含盖C++的方方面面，后者就不是这样。实际上我并没有仔细看过后者，只是同学总是拿这本书上的问题来与我商量，所以有机会偷窥了几眼。暂定你选择的是前者继续学习，在看完后，也许你用C++编制普通的程序已经能够运用自如，但是你仍然应该会有很多问题和遗憾，比如，类继承，虚拟继承，类访问控制，类继承下的访问控制，还有虽然我已经对如何解析十分清楚，但是我仍然感觉我对语法掌握得不系统，遗憾的是，书中出现了很多的库函数，我为什么都不知道？这个时候建议你看看《标准C++宝典》，这本书对于语法正所谓事无巨细，一一道来啊，再就是回顾一下《C++ 程序设计》（钱能），对类的部分讲解的还是十分精辟的。在掌握了一切牢固的语法基础之后，我选择的下一步不是STL，而是IOSTREAM，原因之一是因为《C++ PRIMER》并没有把这一部分讲述的很好，对了，《C++ PRIMER》也没有把STL讲述的很好，所以我看《C++ PRIMER》的时候这些章节都跳过了，我的目标是不求知道，只求精通。对于IOSTREAM，我选的书是《Standard C++ IOStream and Locales》，我当时还是看的E文原版，事实证明，我错了，这本对于当时的我，难度突然拔的太高，所以在看完了第一章之后我就放弃了，只是暂时的搁置下来了。对了，忘记说，对于《C++ PRIMER》或是《the c++ programming language》的学习，你应该十分认真的选择编译器了，我推荐3个首选dev-cpp最高4.9.9.2,然后是vc.net(千万看清楚，不是vc6.0!),最后就是borland c++ builder-X,具体我就不介绍了，相信你学习到这一步，自己应该已经掌握很多的信息了.继续，下一步，我的选择是〈深入探索C++对象模型〉，我是在图书馆借阅的，现在也有电子版了，不过我看了以下，效果一般，但是可以和E文原版的电子版一起看。这本书看完。如果你是跟我一样，把《C++ PRIMER》翻烂掉，能把《深入探索C++对象模型》的知识要点全部背出来的话，我恭喜你，你的C++水平已经到中级了:)接下来，我的选择是对C++这门语言为我提供的所有服务设施通透的学习一边。说穿了，就是库函数，C++库函数分两部分，一部分来自C语言，一部分就是STL，对于C语言部分，我建议你可以买一本C++函数库的书，最近好象刚出了一本，不过我还没有机会看，我看的是〈C和C++代码精粹〉，里面把C语言部分的库函数分为3类，这本书我也就看了这3个章节，其他的东西我知道，看他做甚？而对于STL，你如果真想成为C++出类拔萃的高手，你应该看3本&lt;&lt;C++标准程序库&gt;&gt;&nbsp; &lt;&lt;泛型编程与STL&gt;&gt;&nbsp; &nbsp;&lt;&lt;STL源码剖析&gt;&gt;，第一本主要讲的是如何使用STL，第二本将STL的一些设计理念，并指导你进行泛型设计，所谓泛型说穿了就是指模板。看完这些书，如果你跟我一样，可以把STL全部重写一边的话，那么恭喜你，你已经成为C++准高手，这个时候我的选择是回过头去看《Standard C++ IOStream and Locales》，呵，现在才发现原来这本书这么简单！简直是naive!其实，我现在最想做的事情就是能够把IO全部重写一边，不过还没有找到合适的编译器下手，感觉应该用GCC比较好，还没开始研究，我也不清楚。好了，既然这么多本讲述C++技术的书籍你都搞完了，也不在乎多两本吧，呵呵。知道你应该看什么吗？你应该看看&lt;exceotional c++&gt;还有&lt;effective c++&gt;，这两本书都有more版，不算太难，最后可以看《高质量C++编程》，最后有一套练习题，做做，小菜一样。接下来我的选择是&lt;C++编程思想&gt; 〈设计模式〉 〈大规模C++程序设计〉（最后一本我最近才看完:P）这3本书可不讲什么语法，第一本实在没有必要介绍，似乎每一种语言的编程思想的的书籍都是说的如何用这门语言编程，第二本其实并不能说是针对C++，所有语言通用的一本书，关键是程序设计的方式，第三本被称为〈设计模式〉的C++实践篇，其意义毋庸多说。看完了吗？好吧，你应该选一个项目锻炼一下。如果你能在一个月内看完这所有的书，欢迎你加入ISS_SQL开发团队，这个就是我近期想做的事情，我就是想写一个自己的数据库。不过如果你不是外星人的话，我估计你不可能在一个月的时间内，看完我看了2年的书。对于我刚才说的SQL，我还在选人，说实在的，现在我的同学里，真的是没有几个人的技术能让我看的上的，哎，得一知己难啊!还是继续说编程，这个时候，你已经有了顶级的C++基础，想学什么不容易？JAVA，你学了一个月？？开玩笑，我看了一个星期的书就开始做项目了！其实我觉得到了这个时候是一个面临选择的时候，一个是做UNIX下的开发，一个是做WINDOWS下的，不过我选择了第三条路，也就是我正在学的，算法，因为我的导师正在做973计划中的数据挖掘项目，所以我也沾光，因为是基与weka，所以我用java，这个B语言真弱智，我已经开始讨厌JAVA了，所以我才想用C++重写一个WEKA类的开源软件，不过我感觉用java写算法，的确不错。前段时间，我一个同学为了一个C#问题苦恼，问题粗略说来是GIS设备返回串，要进行处理，提取数据，因为串本身的复杂性，具体是怎么样的我也不知道，因为他的这个是商业项目。这个问题在C#下十分困难，连正则表达式都无能为力，所以我给他的建议是写一个自动机，也不知道他最后的处理方式，不过在java下，呵，大概不超过五十行代码吧。说远了。<BR minmax_bound="true">&nbsp; &nbsp; 最后说说人的问题。有一点点浮躁的人建议你千万别想学C++，直接学VB或者C#算了，希望在浩方有个排名的人，我直接告诉你，你不应该学C++。<BR minmax_bound="true">&nbsp; &nbsp; 关于C++的学习，我就说这么多，其实也感觉没有说什么，只是把我学习C++看的每一门书都罗列出来，虽有显摆之嫌，但也确实希望给那些如曾经的我一样迷茫的摸索者，那些希望学习C++且追求完美技术的人指一条明路。简单的说，你认真看完我上面说的所有书，你就是C++高手！<img src ="http://www.cppblog.com/Jonathan/aggbug/4107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jonathan/" target="_blank">Jonathan</a> 2006-03-13 21:52 <a href="http://www.cppblog.com/Jonathan/archive/2006/03/13/4107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>