C++ 映射的键/值的用户自定义名称?

C++ User-defined names for keys/values of map?

本文关键字:自定义 用户自定 映射 C++ 用户      更新时间:2023-10-16

在 c++ 中遍历映射(或unordered_map(时,键和值通过 .first 和 .second 访问。但是有没有办法以更有意义的方式访问键/值对呢?

例如,如果我将代数表达式存储在map中<集合int>为:

x - 2yz + 3xyz  -->  expr = { {{'x'}, 1}, {{'y','z'}, -2}, {{'x','y','z'}, 3} }

而且我想遍历地图,想要做的似乎很自然:

for(auto & term : expr)
term.vars ...
term.coeff ...

而不是

for(auto & term : expr)
term.first ...
term.second ...

有什么方法可以通过struct Term { set<char> vars; int coeff; };实现这一目标吗?我看不出有任何方法可以将这样的结构与map集成,但是我也想不出任何根本原因,为什么它是不可能的,因为例如它在python中是微不足道的:[(vars,coeff) for vars,coeff in expr.items()]

如果您可以使用c++17,则可以使用structured bindings来分解该对

for (auto [vars, coeff] : expr) { ... }

无需更改其他任何内容。

如果您不能使用c++17那么您的Term结构可以在std::vector或其他sequence container中使用,因为您已经取消了关联性并将其放在结构本身中。

您可以使用结构化绑定:

for (auto & [vars, coeff]: expr) {
f(vars);
g(coeff);
}

这需要C++17。