re: 鏈表實驗 OnTheWay 2011-01-09 07:45
我依據你寫的這篇文章也發表了一篇文章,可能解決你的問題,有空的時候請到我博客看一下。
re: 令人氣憤的現象[未登錄] OnTheWay 2010-05-27 19:19
@GunsNRose
說“#re: 一種線程安全的單例模式實現方式 傻逼實現也好意思貼出來?丟人現眼”這句話的人的名字也是叫“GunsNRose”,可能是碰巧和你重名。
re: 一種線程安全的單例模式實現方式[未登錄] OnTheWay 2010-05-22 09:12
@OwnWaterloo
我覺得不是線程安全的,原因如下:
在你給出的代碼中類S中的函數(雖然現在我還沒有想不出這種函數)可能不是線程安全的。
我的MSN是wwj_5_209@163.com,能否加我一下,我們討論一下。
re: 一種線程安全的單例模式實現方式[未登錄] OnTheWay 2010-05-22 07:17
@OwnWaterloo
您好,首先感謝您對本隨筆的關注。懇請您說詳細一點,我不太明白哪些地方還不是線程安全的。
@vane
以下代碼是根據我的方法寫出來的:
unsigned int Drink(unsigned int nBottleNum)
{
unsigned int nTotal = 0;
unsigned int nBitNum = 1;
for(double i = 1 ; i < sizeof(nBottleNum) * 8.0 ; i++)
{
if(pow(2.0, i) > nBottleNum)
{
nBitNum = static_cast<int>(i);
break;
}
}
for (unsigned int i = 1 ; i <= nBottleNum ; i++)
{
unsigned int nMask = 1;
cout<<"第"<<i<<"瓶水被以下老鼠喝了"<<flush;
for (unsigned int j = 1 ; j <= nBitNum ; j++)
{
if (0 != (nMask & i))
{
nTotal++;
cout<<j<<" ";
}
nMask <<= 1;
}
cout<<endl;
}
return nTotal;
}
我比較愚鈍,經過3個多小時的思考后我明白了2分法,謝謝你讓我又明白了一種方法
@vane
我不太明白您說的二分法是什么意思,能不能舉個例子?
另外你再仔細多看幾遍我說的方法的話,可能會看懂。
template<int T>
int smstrlen(char*p)
{
if(p[T]==0)
return T;
return smstrlen<T+1>(p);
}
想到這種方法很不錯!我沒有想到。
不過這種方法只是把遞歸的邏輯改成了模板實現,并且需要
template<>
int smstrlen<500>(char*p)
{
if(p[500]==0)
return 500;
return -1;
}
這個特化的模板來結束編譯器的遞歸推導過程。
此種解法的思想很好,不過此種方法存在的限制比遞歸還嚴重(需要特化,而這種特化太大了不好,太小了又可能出現問題)。
一下是使用尾遞歸的一種實現:
int MyStelen(char *str, int size = 0)
{
return (*str++ == '\0') ? size : MyStelen(str, size + 1);
}
這種尾遞歸,不存在stack over flow的問題。不過沒有多大實際意義,僅僅具有學術討論價值,還是使用循環的方式比較好。
訪問非法內存的意思是:訪問了你沒有權限操作的內存,或者說是你不應該操作的內存。
(int *)&p - sizeof(int) * 2 ,這句代碼就是訪問了不應該訪問的內存 ,雖然是 - sizeof(int) * 2。
這種操作是依據于實現的,是危險的操作,當然了訪問非法內存并一定會死機。
最后出題人給出的算是答案嗎?!
假如給定的字符串有1億個字符,那么是否需要寫1億個if?
盼給出解釋。
第二個答案根本就是訪問非法內存。
re: c++ 線程池的實現(原)[未登錄] OnTheWay 2010-04-08 20:52
#include <pthread.h> 這個文件是系統的嗎,還是你寫的?
re: 不要把類的外衣脫下來,讓類的美麗消失于無形 OnTheWay 2010-04-03 19:44
@楊帆
感謝你的持續關注。
你的鉆研精神值得敬佩。
re: 不要把類的外衣脫下來,讓類的美麗消失于無形 OnTheWay 2010-04-03 08:59
@楊帆
謝謝你的關注。
不過strValue.c_str()沒有返回什么臨時的指針。
因為c_str()函數返回的是一個char const *類型,這說明返回的指針是不可寫的。但是我為了讓返回的指針可寫,所以加了const_cast。這同時說明有const_cast的地方都存在潛在的錯誤。你可以在VC2005的debug版下看看程序具體的執行過程,在此過程中沒有創建臨時的字符串數組。
@hoodlum1980
呵呵,我的理解有誤,按照你的方案確實可以實現。
不過時間效率和空間效率確實不是太高。
另外如果可以使用這么多系統函數的話,那還是使用標準庫的bitset方便些。
代碼如下:
#include <iostream>
#include <bitset>
#include <algorithm>
using namespace std;
size_t GetBitNumOfOne_ByBitSet(unsigned int nValue)
{
const size_t sizeBitNum = 8;
bitset<sizeof(unsigned int) * sizeBitNum> TestBitSet(nValue);
string strContent = TestBitSet.to_string();
return std::count(strContent.begin(), strContent.end(), '1');
}
void main()
{
//測試數據
cout<<GetBitNumOfOne_ByBitSet(0)<<endl;
cout<<GetBitNumOfOne_ByBitSet(1)<<endl;
cout<<GetBitNumOfOne_ByBitSet(2)<<endl;
cout<<GetBitNumOfOne_ByBitSet(123)<<endl;
cout<<GetBitNumOfOne_ByBitSet(0xff)<<endl;
}
不可行。
你的方法的思想是有點類似于桶排序的思想,但是是不可行的。
首先從時間效率和空間效率上看與上述的任何一個方案相比都沒有優勢。
另外在計算機里數據是按照二進制的方式進行存儲的,按照你的方案還需要把二進制再轉換成16進制的,如果你能進行轉換的話,很可能說明此時你已經知道了這些二進制位中有多少個1了。
re: 面試感悟 OnTheWay 2010-03-24 18:24
@billow
您好,謝謝你的評論。
我最近也想看看關于socket方面的書,我看到你說你在看<精通vc++ Socket編程> 這本書,書的全名是叫什么?感覺這本書怎么樣?謝謝了。
re: 面試感悟 OnTheWay 2010-03-24 09:44
@陳梓瀚(vczh)
謝謝你的回復。
最后這句話確實有些欠妥,太過張狂了。
感謝你的提醒!