怎样高效地判断memcpy(buf1,buf2,3) 是否等于"ABC" 谢谢
怎样高效地判断memcpy(buf1,buf2,3) 是否等于"ABC" 谢谢
if(*((int*)Buf2)==*((int*)"ABC"))
[解决办法]
完全不会!这个是只是通过数组下标来访问数据而已,不会出现像你说的地址移动操作的!
[解决办法]
要说速度的话,当然是以下最快:
if(buf2[0] == 'a' && buf2[1] == 'b' && buf2[2] == 'c' && buf2[3] == '\0')
{
...
}
memcpy(buf1,buf2,3);
if(strcmp(buf1, "ABC") == 0)
谢谢,这样很快吗?我需要非常快速度,我测试下
可不可以直接判断 buf2从位置100-102是否等于“abc"
这是最慢的方法。
[解决办法]
楼主这两天发了好多问题,内容不成体系,只求答案不求原因
我不赞同这种做法,建议楼主还是好好学习基础知识,不要动不动就问别人,这样不会有任何进步
[解决办法]
要说速度的话,当然是以下最快:
if(buf2[0] == 'a' && buf2[1] == 'b' && buf2[2] == 'c' && buf2[3] == '\0')
{
...
}
memcpy(buf1,buf2,3);
if(strcmp(buf1, "ABC") == 0)
谢谢,这样很快吗?我需要非常快速度,我测试下
可不可以直接判断 buf2从位置100-102是否等于“abc"
这是最慢的方法。
晕死,那大神怎样最快呢?
请查阅strlen及其它类似函数的多种实现方法,这些算法基本都可以应用于楼主这样的需求,里面充斥了各种奇技淫巧,有多字节查找的,有直接用汇编的等等。很多年前偶就收集过这些算法,通过互相对比进行经验分析,与这些算法比较,你会觉得自己想出来的垃圾简直无法称为算法。曾经有段时间,自己沉浸在这些算法当中,觉得这些算法已经是最好的了,但后来跟gcc的strlen一比较,gcc的版本比那些算法中最快的版本还要快一倍(在偶当时的机器上),当即放弃了继续探究的念头,从此得出了一个结论,不要把宝贵的时间浪费在重复造轮子的傻事当中,除非你就是算法大师,否则不要随意去挑战标准库的函数,其实你正在挑战一个算法大师,更可能的情况是一群算法大师,你应该站在他们的肩膀上,好好享受他们的工作所带来的快感就行了。
3楼的逐字节比较是最慢的,把"ABC"看作某种能够包含这四个字符的整数类型,直接比较这个数值一次,不就快得多了么?条件是当前编译器不会对跨越对象边界的行为进行限制,例如产生异常等等,当然对于绝大多数编译器来说,这是很容易满足的条件。
[解决办法]
BM或者kmp算法
[解决办法]
大神你好:我才开始学C++一个星期,你说的很多有点深奥,我很惭愧不是太明白
怎么“直接比较这个数值一次”呢?
实际情况是,我有一个char型的数组,就说是一个字符串吧
比如我要判断子串是否是 'A',只需判断一个字节就行
另外还要判断某个子串,肯定是数值,是否是 比如 5.0,但是这个5.0是保存在
char* str =new char[100000000] 这个字符串里的,当然了,'A'和5.0在字符串str里的位置我是知道的
请大神指点一二,多谢了
你说的:“条件是当前编译器不会对跨越对象边界的行为进行限制,例如产生异常等等,”我实在不明白了
楼主的需求我不太明确。一次比较一个"abc"感觉还是不是很快。比较的话直接使用内存比较,不是字符比较,因为你的比较值固定了。 同时读取内存的时候要是总线的大小比较合适。
[解决办法]
要说速度的话,当然是以下最快:
if(buf2[0] == 'a' && buf2[1] == 'b' && buf2[2] == 'c' && buf2[3] == '\0')
{
...
}
memcpy(buf1,buf2,3);
if(strcmp(buf1, "ABC") == 0)
谢谢,这样很快吗?我需要非常快速度,我测试下
可不可以直接判断 buf2从位置100-102是否等于“abc"
这是最慢的方法。
晕死,那大神怎样最快呢?
请查阅strlen及其它类似函数的多种实现方法,这些算法基本都可以应用于楼主这样的需求,里面充斥了各种奇技淫巧,有多字节查找的,有直接用汇编的等等。很多年前偶就收集过这些算法,通过互相对比进行经验分析,与这些算法比较,你会觉得自己想出来的垃圾简直无法称为算法。曾经有段时间,自己沉浸在这些算法当中,觉得这些算法已经是最好的了,但后来跟gcc的strlen一比较,gcc的版本比那些算法中最快的版本还要快一倍(在偶当时的机器上),当即放弃了继续探究的念头,从此得出了一个结论,不要把宝贵的时间浪费在重复造轮子的傻事当中,除非你就是算法大师,否则不要随意去挑战标准库的函数,其实你正在挑战一个算法大师,更可能的情况是一群算法大师,你应该站在他们的肩膀上,好好享受他们的工作所带来的快感就行了。
3楼的逐字节比较是最慢的,把"ABC"看作某种能够包含这四个字符的整数类型,直接比较这个数值一次,不就快得多了么?条件是当前编译器不会对跨越对象边界的行为进行限制,例如产生异常等等,当然对于绝大多数编译器来说,这是很容易满足的条件。
非常同意啊,标准库中的那些算法,让人叹为观止啊。不知道兄台有没有整理出哪些函数的算法比较让人眼前一亮,想重点学习些。
[解决办法]
楼主的需求我不太明确。一次比较一个"abc"感觉还是不是很快。比较的话直接使用内存比较,不是字符比较,因为你的比较值固定了。 同时读取内存的时候要是总线的大小比较合适。
多谢,请教怎么内存比较?
我是创建的动态数组,比如
char* str = new char[10000];
然后fread文件内容到这个数组
现在想知道 str[100] 位置的单个字符是否是'A'
还有想知道 str[201-205] 位置的内容是否是 '123.9'
如果只是比较一个字符,直接str[100] == ‘A'肯定最好,
对201-205,如果还是只是比较一次,直接使用memcmp自然比较好,但是如果你是连续的比较,比如206-209也要比较其他 的,则需要另外考虑。其实对你的需求还不是很了解。
[解决办法]
如果只是比较一个字符,直接str[100] == ‘A'肯定最好,
对201-205,如果还是只是比较一次,直接使用memcmp自然比较好,但是如果你是连续的比较,比如206-209也要比较其他 的,则需要另外考虑。其实对你的需求还不是很了解。
多谢,又知道了一个memcmp函数
想请教下,memcmp的时候,需要考虑关心 ‘\0'吗?就和字符数组那样?
我是想memcmp某个字符数组,比如 char[]="12345X7"
想比较 第3位到第5位是否等于"345"
另外还想判断第6位是否等于'X'
不需要。