投影:是否可以采取STL容器的数据成员的地址?



让我们以(作为一个示例)一个简单的计数算法来获取字符串中的最大字符数。

典型的c++ 17实现可以是:

#include <iostream>
#include <unordered_map>
#include <string_view>
#include <algorithm>
#include <utility>
using Counter = std::unordered_map<char, std::size_t>;
using Pair = Counter::value_type;
constexpr std::string_view s{ "abbcccddddeeeeeffffff" };
int main() {

Counter counter{};
for (const char c : s) counter[c]++;
const auto& [letter, count] = *std::max_element(counter.begin(), counter.end(), 
[](Pair& p1, Pair& p2) { return p1.second < p2.second; });
std::cout << "nnHighest count is '" << count << "' for letter '" << letter << "'nn";
}

在c++ 20中,我们有了投影,并且可以使用指针来构造投影的成员元素(并将其提供给底层的std::invoke)。

解决方案会更短一点,不确定,如果更好(无论什么标准)。总之:

#include <iostream>
#include <unordered_map>
#include <string_view>
#include <algorithm>
using Counter = std::unordered_map<char, std::size_t>;
namespace rng = std::ranges;
constexpr std::string_view s{ "abbcccddddeeeeeffffff" };
int main() {
Counter counter{};
for (const char c : s) counter[c]++;
const auto& [letter, count] = *rng::max_element(counter, {}, &Counter::value_type::second);
std::cout << "nnHighest count is '" << count << "' for letter '" << letter << "'nn";
}

但是,我不确定是否要获取驻留在std::namespace中的容器数据成员的地址。这样可以吗?

我在[namespace]中看到的唯一限制。Std]是指向成员函数的指针。我找不到任何可以禁止使用指针指向标准库类的(public)数据成员的方法。

这也是有意义的,因为函数的限制允许标准库实现选择与标准中描述的不同的重载集,只要直接调用仍然按照指定的方式工作。但是,对于在公共接口中指定的数据成员(不仅仅是公开),实现无法做出类似的选择。

所以我看不出&Counter::value_type::second有什么问题。

相关内容

  • 没有找到相关文章

最新更新