c++中使用equal 比较两个C风格字符串vector的问题

问题描述

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

c++中使用equal 比较两个C风格字符串vector的问题的相关文章

java中 == 与 equal 的区别讲解_java

废话不多说了,开门见山吧,先来看一段代码: 复制代码 代码如下: String str1 = new String("str");        String str2 = new String("str");        System.out.println("==比较 :"+ str1 == str2);        System.out.println("equal比较:"+ str1.equals(str2)); 

SQLSERVER中如何快速比较两张表的不一样

原文:SQLSERVER中如何快速比较两张表的不一样 SQLSERVER中如何快速比较两张表的不一样 不知不觉要写2014年的最后一篇博文了~   一般来说,如何检测两张表的内容是否一致,体现在复制的时候发布端和订阅端的两端的数据上面 我这里罗列了一些如何从数据库层面来解决此类问题的方法 第一步当然就是检查记录数是否一致,否则不用想其他方法了~这里我们用两张表t1_old,t1_new来演示 方法介绍   方法一:老老实实看表结构和表记录数,弊端是根本看不到两张表的数据是否一致,只是看到表结构和

java中”==”和”Equal”的区别

对于一些基本数据类型,int,long,bool,还有char!,"=="都是表示值相等的意思,没有equal方法. equal方法是object对象里面的方法,java中String不是基本数据类型,而是一个类,它们都是继承object类,还有Integer和int的区别也是Integer是一个类! 在object类中,equal方法与"=="是等同的,"=="不是表示值相等,而是比较对象的地址是否相等!Integer和String都重写了(没

Ajax中解析Json的两种方法对比分析

  这里给大家介绍的是Ajax中解析Json的两种方法对比分析,十分的实用,本文为学习笔记,属新手文章,欢迎指教! eval(); //此方法不推荐 JSON.parse(); //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: ? 1 2 3 4 5 var jsonDate = '{ "name":"周星驰","age":23 }'   var jsonObj = eval( '(' + jsonDate + ')' );

Java动画中消除闪烁的两个绝招

1.通过覆盖public void update(Graphics g)来消除闪烁! 在动画的实现中,经常用到repaint()函数来重画屏幕,实现动画的加载,其实在java中repaint()是通过两个步骤来实现刷新功能的,首先它调用public void update()来刷新屏幕,其次再调用paint(Graphcis g)来重画屏幕,这就容易造成闪烁,特别是一些需要重画背景的程序,如果下一桢图象可以完全覆盖上一桢图象的话,便可以重写update函数如下来消除闪烁: public void

ZBrush中绘制纹理的两种方法

  利用ZBrush的内置插件"投影大师"和"Polypainting"纹理贴图能够快速实现纹理的绘制.本文将对这两种方法的应用流程做一个介绍. 在ZBrush中绘制纹理的两种方法: Projection Master(投影大师):这是基于投影的基本纹理系统.用户将他们的模型"投下"到画布接着绘制,最后从画布拾取. Projection Master(投影大师)的概念是比较简单的.当开始3D模型工作时,你激活Projection Master,这

Excel单元格中数据自动换行的两种方法

Excel单元格中数据自动换行的两种方法   不管单元格中是已经有了数据,或者还等待输入数据,都可以对它执行自动换行命令.自动换行的方法有两种,现在就来对下面表格中已经超出单元格宽度的数据使用自动换行. Excel单元格中数据自动换行的方法一 选择要换行的单元格(可以是一个,也可以是多个),然后切换到"开始"选项卡,单击"对齐方式"组中的"自动换行"命令. Excel单元格中数据自动换行的方法二 1.选中要换行的单元格,单击鼠标右键,在弹出的菜单

在PowerPoint中插入视频的两种方法

     为追求更完美效果,在Powerpoint中通过shockwave Flash Object控件插入SWF格式动画已是家常便饭.但很多情况下,演示文档还需要视频做辅助,下面我们介绍在PowerPoint 2007中插入视频的两种方法.   直接插入法        这是最简单方法.用该法插入的视频,在演示界面中仅显示视频画面,和插入图片十分类似.可以说,这是一种无缝插入,效果相当不错,但同时局限性也很大.首 先,该法仅支持插入AVI.MPEG和WMV等Windows Media格式视频,

WPS2013文字中拆分窗口的两种方法

  WPS2013文字中拆分窗口的两种方法          在WPS2013中存在两种方法可以对窗口进行分屏操作,下面就详细的介绍一下如何操作. 1.第一种方法:通过在同一个窗口中新建窗口来实现的,首先点击"视图"下的"新建窗口",然后点击"重排窗口",在下拉选项中包括水平平铺.垂直平铺和层叠三种格式,可以根据自己的需要进行选择. 2.第二种方法:在最新版本的WPS2013文字中,在"视图"菜单下直接由"拆分窗口&