【发布时间】:2017-12-20 14:33:31
【问题描述】:
multimap 的 size 报告它包含的值的数量。我对它包含的键数感兴趣。例如,给定multimap<int, double> foo,我希望能够做到这一点:
const auto keyCount = ???
一种方法是在零初始化的keyCount 上使用for-循环:
for(auto it = cbegin(foo); foo != cend(foo); it = foo.upper_bound(foo->first)) ++keyCount;
但是,这不允许我执行内联操作。所以我无法初始化const auto keyCount。
解决方案可以是包装此for-loop 的 lambda 或函数,例如:
template <typename Key, typename Value>
size_t getKeyCount(const multimap<Key, Value>& arg) {
size_t result = 0U;
for(auto it = cbegin(foo); foo != cend(foo); it = foo.upper_bound(foo->first)) ++result;
return result;
}
但我希望标准提供一些东西。有这种事吗?
【问题讨论】:
-
也许 std::multimap 不是最适合您的数据结构。例如
std::map<key,std::vector<value>>可以更好地工作。 -
包裹 for 循环的
const auto keyCount = std::accumulate(...怎么样? -
@Slava 遇到了
vector的vectors 问题:stackoverflow.com/q/38244435/2642059(虽然这可能仍然是我最好的选择,但我仍然希望得到这个问题的答案。) -
@tobi303 我怀疑
std::accumulate()可以跳过唯一键 -
@tobi303 我要猛烈抨击那将需要我逐步检查
multimap中的所有元素,但我想我很确定upper_bound正在这样做.我想就您的观点而言,我们可能也可以使用count_if或for_each来做到这一点:( 我假设这将是一个很好的答案,如果你输入我会接受。
标签: c++ key size inline multimap