【问题标题】:Associative array in CC中的关联数组
【发布时间】:2014-05-19 11:10:39
【问题描述】:

php 我可以创建一个associative array 喜欢

$my_arr = array('a' => 'Apple', 'b' => 'Ball', 'c' => 'Cat');

是否可以在C中创建associative array

您可能认为这是 Associative arrays in C 的重复问题,但我找不到我想要的。

【问题讨论】:

  • 如果您需要 C++ 解决方案,那么您可以使用map
  • @MadHatter 谢谢。但我想在 c 中得到解决方案
  • C 还是 C++?有区别。
  • @Jefffrey 是的。 C是面向过程的编程语言,C++是面向对象的语言。
  • 在 C 中实现哈希表是相当简单的,尤其是在预先知道大小的情况下,因为大部分代码都与动态调整表大小有关。

标签: php c associative-array


【解决方案1】:

标准 C 中没有预先构建的实用程序来完成此任务。最好的办法是尝试自己实现red-black tree(或hash table,用于非有序关联容器)。

另一方面,如果您有幸使用 C++,则可以使用std::map。这是std::map 的示例:

std::map<char, std::string> map;
map['a'] = "Apple";
map['b'] = "Ball";
map['c'] = "Cat";

Live example

【讨论】:

  • 问题是要求 C 而非 C++ 中的关联数组,不是有效答案
  • @KhaledAKhunaifer,“标准 C 中没有预构建的实用程序来完成这项任务。”不是一个有效的答案吗?
  • @KhaledAKhunaifer,问题是initially tagged with C++ as well
  • @KhaledAKhunaifer 对您来说不幸的是,“C 中没有标准实用程序来完成此任务。最好的办法是尝试自己实现红黑树”是该问题的完全有效答案“是否可以在 C 中创建关联数组?”。
  • 如果您不关心键的顺序,您也可以实现哈希表而不是红黑树。
【解决方案2】:

真正强大且简单的方法是拥有一个带有键和值字段的结构。让我们称之为对(名称源自具有相同名称和用途的 C++ 类)。此外,您还应该考虑您希望对字段具有的类型。我举一个例子作为字符串值作为你的 php 示例。但是为了使用不同的类型,您必须使用 void*,但这会导致非常复杂且可能容易出错的实现。

有点像

struct
{
    char key;
    char* value;
}pair;

struct pair map[size];

pair assocation;
assocation.key = 'a';
assocation.value = "Apple"; // Be sure to allocate the C strings so that you do not introduce memory leak or data corruption, same for void*. This here is just an hack.

map[0] = assocation;  

// Later in your algorithms and parsers you just access it as an value in array.  
pair aPair = map[1];
char aKey = aPair.key;
char* aValue = aPair.value;

当你想要一个像关联数组这样的链表时,再给一个结构体添加一个字段:

void* nextPair;  

这样,您可以在任何地方分配键值对,而无需将它们包含在单个数组中。

【讨论】:

    【解决方案3】:

    正如其他人所说,C 语言级别太低,无法内置关联数组类型。可能最接近它的是使用第三方库,例如 http://svn.freebsd.org/base/head/sys/sys/tree.h,记录在 http://www.freebsd.org/cgi/man.cgi?treehttp://ivoras.sharanet.org/freebsd/usetree.html 中。

    【讨论】:

    • 你能提供一个如何将它用作关联数组的例子吗?
    猜你喜欢
    • 2010-12-27
    • 1970-01-01
    • 2021-05-23
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    相关资源
    最近更新 更多