【问题标题】:What is the meaning of associative array?关联数组的含义是什么?
【发布时间】:2013-02-21 09:14:57
【问题描述】:

我正在阅读 C++ 标准库:教程和参考书。在地图示例中:

   typedef map<string,float> StringFloatMap;
   StringFloatMap coll;

   //insert some elements into the collection
   coll["VAT"] = 0.15;
   coll["Pi"] = 3.1415;
   coll["an arbitrary number"] = 4983.223;
   coll["Null"] = 0;

作者说:

这里使用索引作为键,可以是任意类型。这是关联数组的接口。关联数组是索引可以是任意类型的数组。

谁能解释一下,任意类型在关联数组中是什么意思?

【问题讨论】:

  • 意思是任何。您可以创建一个使用 int 作为键的 std::mapstd::string(如您的示例中),甚至是类的实例。
  • 来自dictionary.comarbitrary: not assigned a specific value,基本上,索引可以是任何东西;一个字符串、一个整数、一个对象……
  • 我假设/期望/希望 Josuttis 继续解释对这种“任意”类型施加的要求

标签: c++ data-structures associative-array


【解决方案1】:

数组通常由元素的位置索引。一个简单的数组 - int x[10],有它的元素 x[0] ... x[9]。索引是一个无符号整数值。

关联容器意味着索引可以是任意(不一定是无符号整数)类型(在本例中为std::string)。

【讨论】:

    【解决方案2】:

    区别在于向量/数组之间,大多数人将其称为序列容器,但实际上可以将其视为关联容器,其中键是完整的范围从 0 到 N 的整数。

    另一方面,映射对键没有这样的限制,它们可以是字符串、整数、任何你想要的类型(当然前提是该类型上有一个合理的相等比较运算符)。

    【讨论】:

    • 好吧,我不会将数组视为由整数索引的关联容器:map[0]map[1000] 分配两个对象,而如果 n &gt; vector.size() 则使用 vector[n] 是未定义的行为。
    • C++中map::operator[]的自动创建语义在我看来与容器的理论分类没有任何关系...
    • 我的观点(您通过说“完整范围”来分享)是您不能将任意 key 与向量一起使用,只能使用 sequence ,因此我不会将其视为关联容器。
    • 它将该范围内的整数与值相关联,因此您可以将其视为关联容器恕我直言。我不太明白超出范围的整数如何进入这场辩论。也许我们只需要同意不同意。
    • 确实,我对关联容器的看法对键没有限制,但我同意这只是我的个人观点,感谢您让我理解 ;-)
    【解决方案3】:

    这意味着您可以创建一个将任意键类型匹配到任意值类型的映射。

    您可以创建将std::strings 映射到floats、shorts 到YourClasses 或YourOtherClassYetAnotherClass 的映射。

    您甚至可以创建一个std::map&lt;void *, void *&gt;,它可以将任何指针映射到任何其他指针。虽然这会产生疑问,因为没有办法找出指针所指向的数据的类型。

    【讨论】:

      猜你喜欢
      • 2019-10-08
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2011-11-18
      相关资源
      最近更新 更多