当前位置:  开发笔记 > 编程语言 > 正文

将std :: map移植到C?

如何解决《将std::map移植到C?》经验,为你挑选了3个好方法。

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

这就是我想要使用的:

在c ++中:

std::map< uint, sTexture > m_Textures;

在c:

typedef struct
{
  uint* intKey;
  sTexture* textureValue;
} sTMTextureMap;

这是可行的还是我过分简化地图?万一你没有达到目的,它的纹理贴图.



1> matt_h..:

许多C实现支持tsearch(3)或hsearch(3).tsearch(3)是一个二叉树,你可以提供一个比较器回调.我认为这就像你要去std :: map一样近.

这是一些c99示例代码

#include 
#include 
#include 
#include 

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;
}



2> 小智..:

你为什么不直接包装一个C接口std::map?即在自己的模块中编写一些C++函数:

typedef std::map Map;

extern "C" {

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

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

// etc...

} // extern "C"

然后链接到您的C应用程序.



3> Mr Fooz..:

这当然是一种可能的实施方式.您可能想要考虑如何实现索引以及将产生的性能影响.例如,您可以将intKey列表作为键的排序列表.查找密钥将是O(log N)时间,但插入新项目将是O(N).

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

另一个替代方案是将其实现为哈希表,假设良好的哈希函数和足够稀疏的intKey数组,它将具有更好的运行时性能.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有