gpt4 book ai didi

c++ - 我可以将 std::begin 和 std::end 专门化为 equal_range() 的返回值吗?

转载 作者:可可西里 更新时间:2023-11-01 16:38:48 26 4
gpt4 key购买 nike

<algorithm> header 提供 std::equal_range() ,以及一些将它作为成员函数的容器。这个函数让我困扰的是它返回一对迭代器,这使得从开始迭代器到结束迭代器的迭代变得乏味。我希望能够使用 std::begin()std::end()这样我就可以使用 C++11 基于范围的 for 循环。

现在,我听到了关于特化的矛盾信息 std::begin()std::end() - 有人告诉我,向 std 命名空间添加任何内容都会导致未定义的行为,而我也被告知您可以提供自己的 std::begin() 特化。和 std::end() .

这就是我现在正在做的:

namespace std
{
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter begin(pair<Iter, Iter> const &p)
{
return p.first;
}
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter end(pair<Iter, Iter> const &p)
{
return p.second;
}
}

这确实有效:http://ideone.com/wHVfkh

但我想知道,这样做的缺点是什么?有更好的方法吗?

最佳答案

17.6.4.2.1/1 The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std unless otherwise specified. A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.

所以是的,我相信,从技术上讲,您的代码表现出未定义的行为。也许您可以编写一个简单的类,在其构造函数中采用一对迭代器并实现 begin()end() 方法。然后你可以这样写

for (const auto& elem: as_range(equal_range(...))) {}

关于c++ - 我可以将 std::begin 和 std::end 专门化为 equal_range() 的返回值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19325984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com