question : i love u ->u love i
analysis:
主要思想是 首先整體逆置句子,然后再尋找句子中每個單詞 做逆置。
需要分析的是: 單詞的定義?空格如何處理?標點符號?
需要注意的地方就是:在需要知道單詞的結尾的時候,需要對字符串最后一個字符進行判斷,如果仍然處于單詞中,這個時候仍然要結束這個單詞,去逆置
?1
void?reverse(char?*s,int?start,int?end)
?2

{?
?3
???if(s?==?null?||?start?>?end?)
?4
???????return;
?5
???for(int?i?=?start,j?=?end;?i?<?j;i++,j--)
?6
????
{
?7
??????char?temp?=?s[i];s[i]?=?s[j];s[j]?=?temp;
?8
??????}
?9
}
10
?1
void?reverse_word(char?*s)
?2

{
?3
??if(s?==?null)
?4
????return;
?5
??int?len?=?strlen(s);
?6
??reverse(s,0,len-1);
?7
??
?8
??int?flag?=?0;//?word?doesnot?begin
?9
??int?i?=?0,start?=?0,end?=?0;
10
??while(s[i]?!=?'\0')
11
??
{
12
?????if(isalpha(s[i])?&&?flag?==?0)
13
?????
{
14
????????start?=?i;
15
????????flag?=?1;
16
?????}
17
?????else?if(flag?==?1?&&?!isalpha(s[i]))
18
????
{
19
??????end?=?i-1;
20
??????reverse(s,start,end);
21
??????flag?=?0;??
22
?????}
23
?????else?if(flag?==?1?&&?s[i+1]?==?'\0')
24
?????
{
25
?????????if(isalpha(s[i]))
26
???????????end?=?i;
27
????????else?
28
????????????end?=?i-1;
29
????????reverse(s,start,end);???
30
???}
31
???i++;
32
???}
33
34
}
35
sizeof(class)總結下:
如果class為空,那么sizeof(class)=1;
如果class 內有虛函數,則要加上一個指針大小
當然class的data member也是要加上的。。。。
轉載水木
誤解:inline函數沒有單獨的函數體,也不能取地址。
inline修飾并不會改變函數的通常語義,仍可通過函數指針調用:
inline?void?f()?{}
void?g()?{
??void?(*p)()?=?f;
??p();
}
------------------------------------------------------------------------
誤解:inline一定導致代碼膨脹
class?Foo?{
public:
????????int?Bar()?{?return?foo;?}
private:
????????int?foo;
};
這樣的Foo::Bar?inline會讓binary變小
------------------------------------------------------------------------
誤解:?inline函數一定是internal?linkage/no?linkage的。
inline與函數的linkage無關。inline函數同樣可以用static和extern修飾,并具
備同一般函數相同的linkage。標準要求external?linkage的inline函數在所有編
譯單元中具有相同的地址。external?linkage的inline函數內定義的靜態變量同
樣應在所有編譯單元中表現為單一對象,具有相同的地址。
------------------------------------------------------------------------
誤解:?如果inline函數包含循環/調用了其他函數/遞歸調用自己,編譯器就無法
??????將其展開。
某些早期的編譯器有這類限制,但對現代編譯器來說它們不再是inline展開的障
礙了。
[insert?RoachCock's?example?here]
------------------------------------------------------------------------
誤解:inline和virtual不能同時修飾一個函數。
inline和virtual并不沖突。以下程序編譯通過。
#include?<iostream>
struct?A
{
??inline?virtual?void?f()
??{
????std::cout?<<?"inline?virtual"?<<?std::endl;
??}
};
------------------------------------------------------------------------
誤解:virtual函數即使聲明為inline,由于是late?binding,無法判斷實際
??????調用的版本,編譯器也無法展開。
虛函數調用并不總是late?binding。
示例:
struct?Base
{
??virtual?void?foo(){cout?<<?"Base::foo"?<<?endl;}
};
struct?Derived?:?Base
{
??void?foo(){cout?<<?"Derived::foo"?<<?endl;}
};
void?bar(Base&?b)
{
??b.foo();??//?late?binding.?if?b?is?a?Derived,?call?Derived::foo
??b.Base::foo();??//?early?binding.?inline
??Derived?d;
??d.foo();??//?early?binding.?inline
}
另外,盡管在您的編譯器中很可能還沒有實現,但即使late?binding理論上也是
可以展開的。
????? 從2006年6月1號在無錫南禪市買了《essential c++》之后,發誓要堅持把它給學下去,盡管我每天都在上班,但是我還是利用車上時間,公司少量時間,和晚上的時間,把這本書看完了,自我感覺功力大增,C語言的功底給了我很大的幫助,我不停地上機實踐,發現問題,解決問題,收獲知識,快速成長,只要自己努力,就一定市可以的。
?? “作為一個好的學習者,背景不是重點,重要的是,你是否具備正確的學習態度,起步固然可以從輕松小品開始,但如果碰上大部頭巨著就退避三舍、逃之夭夭,面對任何技術只求快餐速成,學語言從來不寫程序,那就絕對沒有成為高手乃至專家的一天”
???? 下一個月的目標,是重讀effective c++ ,c++編程用法,c++必知必會,最重要的是上機體會,發現問題,解決問題,積累知識。
這幾天沒來這里,并不代表我沒有看C++,我仍然按計劃在進行,也就是今天,我完成了第五章的閱讀,剩下的這兩天,主要是上機實踐,這樣周一就可以看第六章,一定要按計劃在7月份前高質量把書看完做完。。。
????? 上篇是我寫的一個關于matrix的類,實現了任意指定行和列,已經基本的運算“+,-,*”,還有拷貝賦值操作,應該可以滿足基本的要求。遇到的問題:
在寫拷貝賦值等函數的時候,由于丟掉了 &
matrix&?operator=(const?matrix?&rhs);結果導致了在析構函數無法正常完成,表現的現象free_dbg這個地方出問題,再者,還有地址無法訪問,這個其實是由于沒有新開空間,我就直接賦值了,所以出現了這個問題。
?? 在copy assignment operator這個函數的時候,一定要刪除掉原來的空間,然后new一個空間,再賦值過去。
? 在copy constructor的時候,只要new一個就可以了。
這其實都是對于class內有配置動態內存,需要重寫這兩個函數。。
matrix(const?matrix?&rhs);
一切還都是計劃進行,第四章還剩下一個關于指針函數的問題,明天搞定,然后18號就按計劃進入第15章,還是老話:寫程序才能發現問題