首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将std::map移植到C?

将std::map移植到C?
EN

Stack Overflow用户
提问于 2009-03-15 01:11:06
回答 7查看 33.8K关注 0票数 25

我正在将一些c++代码移植到c。在c中,std::map的可行等价物是什么?我知道在c中没有等同的东西。

这就是我正在考虑使用的:

在c++中:

代码语言:javascript
复制
std::map< uint, sTexture > m_Textures;

在c中:

代码语言:javascript
复制
typedef struct
{
  uint* intKey;
  sTexture* textureValue;
} sTMTextureMap;

这是可行的,还是我过于简化了地图?以防万一你没有得到它的目的,这是一个纹理贴图。

EN

回答 7

Stack Overflow用户

发布于 2009-03-15 02:18:40

许多C实现都支持tsearch(3)或hsearch(3)。tsearch(3)是一个二叉树,您可以提供一个比较器回调。我认为这差不多就是你将要得到的std::map。

下面是一些c99示例代码

代码语言:javascript
复制
#include <search.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct
{
      int key;
      char* value;
} intStrMap;

int compar(const void *l, const void *r)
{
    const intStrMap *lm = l;
    const intStrMap *lr = r;
    return lm->key - lr->key;
}

int main(int argc, char **argv)
{
    void *root = 0;

    intStrMap *a = malloc(sizeof(intStrMap));
    a->key = 2;
    a->value = strdup("two");
    tsearch(a, &root, compar); /* insert */

    intStrMap *find_a = malloc(sizeof(intStrMap));
    find_a->key = 2;

    void *r = tfind(find_a, &root, compar); /* read */
    printf("%s", (*(intStrMap**)r)->value);

    return 0;
}
票数 34
EN

Stack Overflow用户

发布于 2010-10-01 23:19:05

为什么不干脆在std::map周围包装一个C接口呢?Ie在自己的模块中编写一些C++函数:

代码语言:javascript
复制
typedef std::map<int, char*> Map;

extern "C" {

void* map_create() {
  return reinterpret_cast<void*> (new Map);
}

void map_put(void* map, int k, char* v) {
  Map* m = reinterpret_cast<Map*> (map);
  m->insert(std::pair<int, char*>(k, v));
}

// etc...

} // extern "C"

然后链接到你的C应用程序。

票数 18
EN

Stack Overflow用户

发布于 2009-03-15 01:30:40

这当然是一种可能的实现。您可能需要考虑如何实现索引,以及这将对性能产生什么影响。例如,您可以将intKey列表设置为键的排序列表。查找一个键需要O(log )时间,但是插入一个新项需要O(N)。

您可以将其实现为树(如std::map),然后进行O(log )插入和查找。

另一种选择是将其实现为哈希表,假设有一个好的哈希函数和足够稀疏的intKey数组,这将具有更好的运行时性能。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/647054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档