问题描述
- c++中使用equal 比较两个C风格字符串vector的问题
-
c++primer(第5版)中的一个练习题 P339 T10.5
如果两个容器中保存的是c风格字符串list<const char *>
,运用equal 比较两个容器会出现什么样的结果?
#include <list> #include <iostream> #include <algorithm> #include <numeric> using std::list; using std::cout; using std::endl; using std::equal; int main() { list<const char*> lc(12, "bca"); list<const char*> lc2(12, "bc"); cout << equal(lc.cbegin(), lc.cend(), lc2.cbegin());//#1 输出0 list<const char*> lc3(12, "bca"); list<const char*> lc4(12, "bca"); cout << equal(lc3.cbegin(), lc3.cend(), lc4.cbegin());//#2 输出1 cout<< typeid(*lc3.begin()).name();//#3 char const * cout<< (*lc3.begin()==*lc4.begin());//# 4编译通过 输出1 return 0; }
请问:
1.按道理来说两个C风格字符串是未定义“==”运算符的,运用“==”比较应该比较的是其指针指向的元素,但第一第二个cout表明并不是这样?
2.是否是equal算法重载了“==”运算符?
3.迭代器指向元素的比较也是用的元素类型的比较运算符,为什么第四个cout结果为1
解决方案
前三个问题其实看一下equal实现的源码就很清楚了,注意查看官方文档
这里面写的很清楚:The elements are compared using operator== (or pred, in version (2)).
也就是这里的==是做过重载了的
最后一个问题其实挺有意思,但是要记着,字符串之间的==一般(注意是一般,这个有时候特殊)都是比较字符串地址,
你list生成的时候用的是一个"字符串常量",你虽然创建了两个list,然而初始化用的是同一个”字符串常量“(存储在静态数据区,是全局的)
说白了就是地址是一样的,字符串常量的问题有时候一眼看不出来,但是确实是一个比较有意思的点,下面是我运行时候断点的截图:
可以看到他们两个地址都是一样的,代表了他们其实确实是指向同一个”字符串常量“,当然同一个字符串常量执行 == 操作,地址当然是相等的了
ps:多打断点,这些问题就很容易找出来,一开始我也没想到是“字符串常量的”锅,但是断点一下,看到地址,就回忆起来了
解决方案二:
memcmp比较两个C风格字符串
c风格字符串与c++string的比较
c风格字符串与c++string比较
解决方案三:
operator ==中遍历两个vector,然后一个个元素比较
解决方案四:
equal算法很可能重载了“==”运算符
时间: 2024-12-29 16:00:18