繁体   English   中英

我们可以为STL映射中的密钥使用用户定义的类吗?

[英]Can we use a user defined class for the key in a STL map?

我在地图中需要一个键,但是,我发现它应该是多个数据。 我可以将这些数据放在一个用户定义的类中,然后将整个类作为键放在地图中吗?

会影响时间效率吗?

在此还应注意哪些其他问题?

只要是,任何类型都可以用作键

  • 可复制的
  • 可分配的
  • 可比,因为地图是按键排序的

如果您的课程只是一个简单的结构,那么它已经是可复制和可分配的。 为了使类具有可比性,您必须实现operator< ,或者使用要使用的自定义比较函数创建映射。

对时间效率的唯一影响来自较大的对象,它们需要花费更长的时间进行复制和比较。 如果对象需要那么大,那么您就无能为力了,所以不用担心。

只要该类具有一个operator< (或以其他方式使它的实例<比较,例如,通过定义一个独立的operator< ,它可以以一种方式或另一种方式接受两个这样的实例作为参数,或者再次创建地图(带有显式比较对象),则可以正常运行。 当然且仅当该运算符或函数(以及其他关键位(如其复制构造函数))是正确的时,它才会很快。

编辑 :添加了额外的位, operator< (如果要使用它而不是提供一个显式的比较对象)不必是运算符,而可以是一个单独的函数-tx到@Neil以便在注释中指出。

用作地图键类型的类型要么需要具有std::less<T>专门化,要么需要另一个谓词(而不是默认的std::less )传递给地图。 std::less的默认实现使用< 所以你可以

  1. 您的类型的重载operator<()
  2. 专精于std::less
  3. 将不同的谓词传递给std::map

是的,您可以使用任何类作为键,只要它实现小于运算符<或在地图定义中给出比较特征即可。

除非在实践中证明是个问题,否则不要担心时间。

当然,关于使用用户定义的键类。 由于Map的定义方式,您必须为类定义一个“小于”运算符(operator <),或在构造映射时提供一个比较器对象。 是后者的一个例子。

关于效率,不必过早担心,但是要担心的是复制关键对象的成本是多么昂贵。

这与效率无关,而是避免以可能影响operator <在地图中的结果的方式更改键的内容。

如果您对使用键的不同组件进行有效索引感兴趣(因为您说它是“多个数据”),请查看boost :: multi_index

当然可以,您只需要重载“ <”运算符即可设置用户定义的键。 一个例子:

struct x
{
int t;
bool operator<(const x &a) const
{   return (this->t < a.t);      }
};

int main()
{
x p={10}, q={11}, r={12};
map<x,int> m;
m[p]=1; m[q]=2; m[r]=3;
for(auto w: m)
cout<<w.first.t<<" "<<w.second<<"\n";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM