【基础】结构体重载,用 char*作为std::map中的key

结构体重载

C++中,结构体是无法进行==,>,<,>=,<=,!=这些操作的,这也带来了很多不方便的地方,尤其是在使用STL容器的时候,如果我们可以往语句中传入结构体,一些事情将会变得很简单。

bool operator 运算符 (const 结构体名称 b) const
{
    return(什么时候这个运算符对结构体成立);//注意对此运算符使用this->元素名;
}

用 char*作为std::map中的key

首先为什么要用 char*作为std::map中的key

map<char*,int>和map<string,int>在插入和存储效率的对比。

插入100000条                    查询100000次

map<string,int>              119ms                                  89ms

map<char*,int>               9ms                                      6ms

声明map时需要添加一个cmp比较函数,不然map在比较时,使用char *的指针进行比较,而不是比较char字符串。

#include <cstring>

struct cmp_str
{
    bool operator()(char const *a, char const *b)
    {
        return std::strcmp(a, b) < 0;
    }
};

int main ( int argc, char ** argv )
{

    std::map<const char*, int, cmp_str> map;

    map["aa"]  = 1;
    map["ca"]  = 2;
    map["ea"]  = 3;
    map["ba"]  = 4;

    map["ba"]  = 5;
    map["bb"]  = 6;

    map["ba"]  = 7;

    std::map<const char*, int, cmp_str>::iterator it = map.begin();
    for (; it != map.end(); it++ )
    {
        std::cout << (*it).first << ": " << (*it).second << std::endl;
    }

    return 0;

}

参考博客:
用 char*作为std::map中的key

map<char*,int>和map<string,int>的效率对比?

原文地址:https://www.cnblogs.com/Kohinur/p/8977263.html

时间: 2024-11-10 13:56:38

【基础】结构体重载,用 char*作为std::map中的key的相关文章

黑马程序员---C语言基础---结构体

------iOS培训.Java培训.Android培训, iOS学习型技术博客,期待与您交流------ C语言基础---结构体 一.什么是结构体 介绍结构体之前,我想先简单介绍下数组.我想大家对数组都再熟悉不过了,顾名思义,数组就是将一些数据(元素)组合在一起,作为一个整体.使用数组需要注意的是这些元素必须是相同类型.而结构体和数组类似,也是将一些数据组合在一起作为一个整体,但是这些元素可以是不同类型.可以这么理解:结构体是更加灵活的数组,因为它允许元素是不同的类型. 实际生活中,如果我们要

C#语言基础——结构体和枚举类型

结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承. 用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等.这可以节省内存,因为没有如类对象所需的那样有额外的引用产生.例如,当声明含有成千上万个对象的数组时,这会引起极大的差异. 结构体是一个变量组,将一组变量放在一起,

2016.8.3 C#基础 结构体,枚举类型

结构体-枚举类型 一.枚举类型 枚举(enum)是值类型的一种特殊形式,它从System.Enum继承而来,并为基础类型的值提供替代名称.枚举类型有名称.基础类型和一组字段.基础类型必须是一个除char 类型外的内置的有符号(或无符号)整数类型(如Byte.Int32或UInt64).也可以说,枚举类型是一组常量的集合. 1.定义:Enum....{E} 枚举元素的默认基础类型为int.默认情况下,第一个枚举数的值为0,后面每个枚举数的值依次递增1.例如: enum meiju://枚举是常量的

全局结构体变量的初始化以及将结构体变量转换为char类型输出问题

#include<stdio.h> #include<stdlib.h> struct node{ int a; int b; char c; char d; }; /*struct node A; 全局变量不能在这儿进行初始化,令我震惊啊,错误让你迷茫到死 A.a=1; A.b=2; A.c='a'; A.d='c';*/ //struct node A={1,2,'a','c'};但是这种写法可以 1:初始化和赋值不是一个概念. 2:// 在全局空间(即函数体之外)只能执行数据

C基础--结构体

C语言,结构体语法: 1.定义结构体类型: struct 结构体名称 { 成员类型 成员名称1; 成员类型 成员名称2; ... }; 例:struct Date { int year ; int month ; int day ; } 2.结构体在内存中 例一: struct Student { char *name;//指针占8个字节 int no;//int占4个字节 int age;//int占4个字节 }; struct Student s1 ; int length = sizeof

数据结构基础-结构体struct及类型别名typedef的使用

一.结构体的创建 在C语言中,实现数据结构的一种常用方法便是使用结构体(structure)其示例代码如下: struct stu { int num; char ch; }; struct表示创建结构体 stu为结构体名称,里面的内容是各种变量类型(可以嵌套struct),然后使用示例如下: struct stu s; scanf("%d", &s.num); printf("%d\n", s.num); 第一行表示创建结构为stu的结构体s,此后访问结构

OC基础--结构体 枚举做类成员属性

结构体  枚举作类的成员属性: 定义一个学生类 性别 -- 枚举 生日 入学日期  毕业日期  --  结构体 代码示例: 声明文件 Student.h: #import <Foundation/Foundation.h> typedef struct { int year; int month; int day; } Date; typedef enum { kGenderGirl = 0, kGenderBoy = 1, kGenderChunGe = 2 } Gender; @inter

面向对象基础——结构体

1.结构体的语法 定义的时候需要使用关键字struct [public] struct 结构名 { public 类型名 变量名; … } 我们常见的结构体:System.Drawing.Point.Size.Color 注意: 1.结构使用时可以new,也可以不new.如果不new,则使用前必须为结构成员赋值. 2.在结构中不能为变量直接赋初值,除非const(常量).static(静态变量) 2.结构体与类 它们是 .NET Framework 中的通用类型系统的两种基本构造.两者在本质上都

C#基础——结构体

集合:数组:同一类型,固定长度集合:不同类型,不固定长度 要使用集合,必须先引用命名空间:using System.Collections; 定义:ArrayList arr = new ArrayList(); 赋值:arr.Add("值/变量"); //object类型object类型:所有类型的基础类型(基类) 获取个数:arr.Count; 取值:arr[索引] 插队:arr.Insert(索引,值/变量) 移除:arr.Remove(值);arr.RemoveAt(索引);