標籤:

為什麼代碼中的comp函數只需返回0就可以表示兩串相同?

#include&
#include&
#include& #include&
struct comp
{
bool operator() (const std::string a, const std::string b)
{
int l1=a.length(),l2=b.length();
if(l1!=l2) return l1↦
std::map&::iterator it_map;
std::multimap& &>multimap;
std::multimap&::iterator it_mm;
int a,b,n;std::string input,inp;
int main()
{
std::ios::sync_with_stdio(false);
std::cin&>&>a&>&>b&>&>n;
while(std::cin&>&>input)
inp+=input;
int l=inp.length();
for(int i=a;i&<=b;i++) for(int j=0;j+i&<=l;j++) map[inp.substr(j,i)]++; for(it_map=map.begin();it_map!=map.end();it_map++) multimap.insert(std::pair&(it_map-&>second,it_map-&>first));
int old=-1,thisout,totout=0,first;bool flag=0;
for(it_mm=multimap.begin();it_mm!=multimap.end();it_mm++)
{
first=it_mm-&>first;
if((first!=old old!=-1) || (thisout%6==0 thisout!=0)) {std::cout&<&<" ";flag=1;} if(!((first!=old old!=-1) || (thisout%6==0 thisout!=0)) old!=-1) {std::cout&<&<" ";flag=0;} if(first!=old) { totout++; if(totout==n+1) break; std::cout&<&second;
flag=0;
thisout++;
}
if(!flag) std::cout&<&


0 相等,正數大於,負數小於。通過減法延續下來的通俗約定而已,你定義 2、3、4也沒問題,只要花功夫去和用函數的人解釋清楚。


x86裡面的比較和減法做的事情是一樣的,後來這個關於整數的習慣做法被推廣了。


個人感覺是因為寫個函數嵌套一下就可以直接用作qsort的比較函數(霧 ... 只是直覺)

畢竟它的名字裡面有一半是cmp~


兩個值如果相等,那麼這兩個值的差或者異或值是0,硬體上是這麼比較的,猜測軟體為了方便也和硬體設計的一致了,然後再慢慢演變就變成了相等為0,然後這麼做的人多了,就成了默認的規則。曾經接一個項目,裡面cmp的實現是相等返回true,不等返回fasle,我沒注意,然後程序一直出錯,後來一怒之下把cmp的實現又改回來了。


大概是因為要比較的兩個值相等時,必須返回0?


a="13", b="12"

返回false。

a=b=「12」

返回0,函數簽名返回值類型是bool,0視為false

怎麼區分?立錯。

這是模仿C的int strcmp(a, b)沒有模仿對吧?


@_@這是約定。

至於0的淵源,見輪子哥的回答。


推薦閱讀:

如何看待微軟自己的產品不用自己的庫寫而用Qt寫?
看完《C++ Primer》和《Effective C++》能找到一份起薪 5000 元以上的工作嗎?
C++ deallocate(pointer p,size_type n)第二個參數問題?
C++能勝任C的所有工作嗎?不行,有哪些?
c++delete一個指針,沒有賦值為null,再創建同類型的指針,有沒有可能被釋放資源的內存地址被重新使用,賦值給新指針?如何用程序驗證這種可能性?這個class里有成員是引用,引用所指的內存也會被釋放嗎?

TAG:編程 | STL | C |