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)
谢谢你的回复。
最后这句话确实有些欠妥,太过张狂了。
感谢你的提醒!