Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将std::map移植到C? 我正在把一些C++代码移植到C中。在c中,std::map的可行等价物是什么? 我知道c语言中没有对等的语言_C++_C_Porting - Fatal编程技术网

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

将std::map移植到C? 我正在把一些C++代码移植到C中。在c中,std::map的可行等价物是什么? 我知道c语言中没有对等的语言,c++,c,porting,C++,C,Porting,这就是我想使用的: 在c++中: std::map< uint, sTexture > m_Textures; 这是可行的还是我过于简化了地图?以防万一,你没有得到一个纹理贴图的目的。在C语言中没有提供类似贴图功能的标准库。您需要使用支持通过键访问元素的某种形式的容器来实现自己的map-like功能。这当然是一种可能的实现。您可能想考虑如何实现索引和将产生什么性能影响。例如,您可以让intKey列表成为键的排序列表。查找密钥的时间为O(logn),但插入新项的时间为O(N) 您可以

这就是我想使用的:

在c++中:

std::map< uint, sTexture > m_Textures;

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

在C语言中没有提供类似贴图功能的标准库。您需要使用支持通过键访问元素的某种形式的容器来实现自己的map-like功能。

这当然是一种可能的实现。您可能想考虑如何实现索引和将产生什么性能影响。例如,您可以让intKey列表成为键的排序列表。查找密钥的时间为O(logn),但插入新项的时间为O(N)

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

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

mandbopen

提供NULL作为文件参数,它将是一个只在内存中存储键/值数据的容器


还有各种具有类似键/值功能的Berkeley数据库库接口(man dbm,从Sleepycat查看BerkeleyDB,尝试一些搜索,等等)

您可以选择如何实现它。如果使用链表方法,则插入将为O(1),而检索和删除将为O(n)。如果你使用更复杂的东西,比如红黑树,你会有更好的平均性能

如果你自己实现它,链表可能是最简单的,否则从互联网上获取一些适当授权的红黑树或其他类型的树将是最好的选择。不建议实现您自己的红黑树。。。我已经这样做了,不想再这样做了


<>和回答一个你没有问的问题:也许你应该重新检查从C++移植到C是否真的提供了你想要的所有好处。当然,在某些情况下可能需要它,但并不多。

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

下面是一些c99示例代码

#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;
}
#包括
#包括
#包括
#包括
类型定义结构
{
int键;
字符*值;
}intStrMap;
整数比较(常数无效*l,常数无效*r)
{
常数intStrMap*lm=l;
常数intStrMap*lr=r;
返回lm->key-lr->key;
}
int main(int argc,字符**argv)
{
void*root=0;
intStrMap*a=malloc(sizeof(intStrMap));
a->key=2;
a->value=strdup(“两个”);
t搜索(a,&根,比较);/*插入*/
intStrMap*find_a=malloc(sizeof(intStrMap));
查找a->key=2;
void*r=tfind(find_a,&root,compar);/*read*/
printf(“%s”,(*(intStrMap**)r)->值);
返回0;
}

为什么不在
std::map
周围包装一个C接口呢?IE在自己的模块中写了几个C++函数:

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"
typedef std::map;
外部“C”{
void*map_create(){
返回reinterpret_cast(新地图);
}
void map_put(void*map,int k,char*v){
Map*m=重新解释(Map);
m->insert(std::pair(k,v));
}
//等等。。。
}//外部“C”

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

我尝试用C实现一个映射,它是基于void的*

这项工作正在进行中,但地图已经完成


它是基于红黑树编写的。

有没有任何开源项目可以实现您提到的这些实现?一个可读性很好的黑树实现就是OpenBSD。它适合于单个头文件,可以用于任何结构。看到“Matth”,我可以用char []作为关键字吗?当然,你只需使用“STRCMP(LM-键,LR -> key)”之类的“C结构”的“易用哈希表”来编写COMPAR。“BR> VIV:如果这是可行的,为什么不把代码作为C++来做呢?你还不需要把C++库链接到应用程序吗?”
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"