C++ map以结构体为key的编译错误和解决方法

//map 

//define

struct TempCoeffIndex
{
int tempClass;
int sfc;
};

mutable std::map<TempCoeffIndex,float> CONST_TEMP_COEFF;


// insert data into map

SCC::TempCoeffIndex tempIndex={0};

for(int i=0;i<4;++i)
{
tempIndex.tempClass = i+1;
for(int j=0;i<18;++j)
{
tempIndex.sfc = j+1;

CONST_TEMP_COEFF.insert(make_pair(tempIndex,i*j));
}
}


// compile 

c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2678: 二进制“<”: 没有找到接受“const SCC::TempCoeffIndex”类型的左操作数的运算符(或没有可接受的转换)


// cause

原因,map中的key默认是以less<>升序对元素排序(排序准则也可以修改),也就是说key必须具备operator<对元素排序,而平常我们的用的基本上都是基本类型元素作为key,所以就没有问题


// solution

//重写operator < ()

struct TempCoeffIndex
{
int tempClass;
int sfc;

bool operator <(const TempCoeffIndex& rs) const
{
if(tempClass < rs.tempClass)
{
return true;
}
else if(tempClass == rs.tempClass)
{
return sfc < rs.sfc;
}
return false;
}
};


### 回答1: 可以这样写: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> typedef struct { int x; int y; } Point; typedef struct { Point key; int value; } MapNode; typedef struct { MapNode *nodes; int size; int capacity; } Map; void map_init(Map *map) { map->size = ; map->capacity = 16; map->nodes = (MapNode *) malloc(sizeof(MapNode) * map->capacity); } void map_put(Map *map, Point key, int value) { if (map->size == map->capacity) { map->capacity *= 2; map->nodes = (MapNode *) realloc(map->nodes, sizeof(MapNode) * map->capacity); } MapNode *node = &map->nodes[map->size++]; node->key = key; node->value = value; } bool map_get(Map *map, Point key, int *value) { for (int i = ; i < map->size; i++) { if (map->nodes[i].key.x == key.x && map->nodes[i].key.y == key.y) { *value = map->nodes[i].value; return true; } } return false; } int main() { Map map; map_init(&map); Point key1 = {1, 2}; Point key2 = {3, 4}; map_put(&map, key1, 10); map_put(&map, key2, 20); int value; if (map_get(&map, key1, &value)) { printf("(%d, %d) -> %d\n", key1.x, key1.y, value); } if (map_get(&map, key2, &value)) { printf("(%d, %d) -> %d\n", key2.x, key2.y, value); } return ; } ### 回答2: 下面是一个使用结构体作为键的C语言map示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义一个结构体作为mapkey typedef struct { int id; char name[50]; } MapKey; // 定义一个结构体作为map的value typedef struct { int score; } MapValue; // 定义一个键值对结构 typedef struct { MapKey key; MapValue value; } KeyValuePair; // 定义map结构 typedef struct { KeyValuePair* data; int capacity; // map容量 int size; // map大小 } Map; // 初始化map void map_init(Map* map, int capacity) { map->data = malloc(capacity * sizeof(KeyValuePair)); map->capacity = capacity; map->size = 0; } // 添加键值对到map void map_put(Map* map, MapKey key, MapValue value) { if (map->size == map->capacity) { // 扩容操作 map->capacity *= 2; map->data = realloc(map->data, map->capacity * sizeof(KeyValuePair)); } KeyValuePair pair; pair.key = key; pair.value = value; map->data[map->size++] = pair; } // 根据keymap中获取value MapValue* map_get(Map* map, MapKey key) { for (int i = 0; i < map->size; i++) { if (map->data[i].key.id == key.id && strcmp(map->data[i].key.name, key.name) == 0) { return &map->data[i].value; } } return NULL; // key不存在返回NULL } int main() { Map map; map_init(&map, 10); MapKey key1 = {1, "Tom"}; MapValue value1 = {80}; map_put(&map, key1, value1); MapKey key2 = {2, "Alice"}; MapValue value2 = {90}; map_put(&map, key2, value2); MapKey key3 = {3, "Bob"}; MapValue value3 = {75}; map_put(&map, key3, value3); MapKey searchKey = {2, "Alice"}; MapValue* result = map_get(&map, searchKey); if (result != NULL) { printf("Score of key '2, Alice' is %d\n", result->score); } else { printf("Key not found.\n"); } free(map.data); return 0; } ``` 这个示例定义了用于存储键值对的结构体`KeyValuePair`,以及用于作为map结构体`Map`。初始化map,需要指定容量,并通过`map_init`来分配内存。使用`map_put`向map中添加键值对,键值对的key和value通过结构体进行传递。通过`map_get`可以根据key获取对应的value。 在示例中,我们先创建一个map,并添加了三个键值对,然后使用`map_get`根据key查找其中一个value。最后释放内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值