2 u010984956 u010984956 于 2016.04.28 13:55 提问

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

4个回答

b491985496
b491985496   2016.04.29 15:38

前三个问题其实看一下equal实现的源码就很清楚了,注意查看官方文档

这里面写的很清楚:The elements are compared using operator== (or pred, in version (2)).
也就是这里的==是做过重载了的

最后一个问题其实挺有意思,但是要记着,字符串之间的==一般(注意是一般,这个有时候特殊)都是比较字符串地址,
你list生成的时候用的是一个"字符串常量",你虽然创建了两个list,然而初始化用的是同一个”字符串常量“(存储在静态数据区,是全局的)
说白了就是地址是一样的,字符串常量的问题有时候一眼看不出来,但是确实是一个比较有意思的点,下面是我运行时候断点的截图:

可以看到他们两个地址都是一样的,代表了他们其实确实是指向同一个”字符串常量“,当然同一个字符串常量执行 == 操作,地址当然是相等的了

ps:多打断点,这些问题就很容易找出来,一开始我也没想到是“字符串常量的”锅,但是断点一下,看到地址,就回忆起来了

u010984956
u010984956 感谢大神~ 豁然开朗
大约 2 年之前 回复
CSDNXIAON
CSDNXIAON   2016.04.28 14:02

memcmp比较两个C风格字符串
c风格字符串与c++string的比较
c风格字符串与c++string比较
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

oyljerry
oyljerry   Ds   Rxr 2016.04.28 14:21

operator ==中遍历两个vector,然后一个个元素比较

ZGZ1002
ZGZ1002   2016.04.29 11:17

equal算法很可能重载了“==”运算符

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
字符串比较用equal以及==的区别
从object类来看,equal和==都是比较的对象的地址,但是在String中,equal比较的是内容是否相等,因为在String中对equal进行了重写。 String 字符串类:笔试题目:new String(“abc”)创建了几个对象?两个对象, 一个对象是 位于字符串常量池中,一个对象是位于堆内存中。如下代码:test(null),给传入null的时候如果str放在前面调用equal的方
C++Primer第五版 10.2.1节练习
练习10.3:用accumlate求一个vector<int>中的元素之和。 答:见练习10.3.cpp练习10.4:假定v是一个vector<double>,那么调用accmulate(v.cbegin(),v.cend(),0)有何错误(如果存在的话)? 答:序列中的元素的类型必须与第三个参数匹配,或者能够转换为第三个参数的类型。因此,由于此处是0,元素中的元素转化为int型,最终计算结果是
C风格字符串和C++string类对比 使用实例
一.C风格字符串 ◆ 1、字符串是用字符型数组存储的,字符串要求其尾部以’\0’作为结束标志。如:     char string[ ]=”C++ programming language”; 用sizeof来测string长度为25个字节,而实际串本身长度(含空格)为24个字节,多出来的一个就是串结束符’\0’(含0)。 ◆ 2、指针与字符串     char *pstr=”C++
java关于比较两个字符串时的等号和equal
== :     等号比较两个纯字符串时,比较基本类型,如果值相同,则返回 true       而比较引用时,如果引用指向同一内存中的同一对象,则返回 true equals: 只比较两个对象的内容是否相等,相等则返回true public void testString(){ String a = "aa"; String b = new Stri
使用C风格字符串你必须知道的几点
最近在看C代码写的开源软件putty,因为C代码经验非常少,分析起来很吃力,觉得把C语言的一些特性在复习一下很有必要,这里利用中午的半个小时把C风格的字符串总结一下: 0. 所有人都知道的一点: C风格字符串都是以'\0'结尾的。所以如果拷贝一个字符串,请确保计算的长度已经考虑了这个结尾符号。 另外C风格的字符串是在内存上申请数组存储的,所有的保护措施需要申请者自己维护,n
C++ 中string类型和 C风格 char类型字符串比较
与char*不同的是,string不一定以NULL('\0')结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char* 1、首先必须了解,string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如be
Java中"=="和equals方法在字符串比较中的不同
昨天写代码的时候,遇到了比较两个字符串的值是否相同的情况,然后发现使用"=="和equals会得到不同的结果。其实我的目的是比较两个字符串的序列是否相同,这个时候应该使用equals方法的。大家在比较两个字符串的时候一定要想明白自己到底是要比较这两个字符串的什么,是序列还是引用?现在把自己总结的内容写下来。 首先介绍什么是字符串池:Java中有一个字符串池,其实是很多字符串的一个集合。字符串池由
C比较两个字符串中的不同的字符串
有字符串A和字符串B,假定s("I am a student"),t("am a"),那么程序的输出结果为C("I","student"),也即t字符串是取自s中的一部分,将s中不在t中的单词输出出来。
c语言比较两个字符串是否相等strcmp
C语言提供了几个标准库函数,可以比较两个字符串是否相同。以下是用strcmp()函数比较字符串的一个例子: #include #include int main(void) { char str_1[] = "abc"; char str_2[] = "abc"; char str_3[] = "ABC"; if (strcmp(str_1, str
String中==和equal()的区别
==是判断两个字符窜引用是否相等。 .equal()判断的是两个字符窜值是否相等。 不同对象总是产生不同的散列值,即便是他们是相等的值也可以。 因此,如果你想要判断两个字符串是否相等你最好使用.equal()方法,除非在一些特殊情况下你能保证当前两个string的值代表的是同一个对象。 下面是一些测试==方法的类别: / These two have the same value ne