为什么C++标准库中的集合(std::set
和std::multiset
)提供非const_iterator
方法(set::begin
和multiset::begin
)?
通过迭代器访问键始终是const
。无论集合本身是否为const都没有关系。为什么要引入这些额外的重载呢?
为什么C++标准库中的集合(std::set
和std::multiset
)提供非const_iterator
方法(set::begin
和multiset::begin
)?
通过迭代器访问键始终是const
。无论集合本身是否为const都没有关系。为什么要引入这些额外的重载呢?
a.begin()
产生一个迭代器(或常量a
的const_iterator
)
- a.end()
产生一个迭代器(或常量a
的const_iterator
)
- ...C::iterator
和 C::const_iterator
),并且这些函数应该产生这些类型。要求不是明确必须存在这四个重载版本 (也不要求这两种迭代器类型必须不同)。要求只是行为上的要求。set
实现:template <class Key, class Compare = std::less<Key>, class Allocator = std::allocator<Key>>
class set {
public:
struct iterator { ... };
using const_iterator = iterator;
iterator begin() const { ... };
iterator end() const { ... };
// other stuff
};
begin()
和一个end()
。
并没有额外的重载函数。或者至少,在实现者的手中决定是否需要。为什么要引入这些额外的重载函数?
#include <iostream>
#include <vector>
#include <set>
template <class C> //C is some container
void f(C& c)
{
typedef typename C::iterator iter;
typedef iter (C::*fn)(); // note non-const method
fn begin = &C::begin; // will fail with set if begin() is const only
fn end = &C::end;
for (iter i = (c.*begin)(), e = (c.*end)(); i != e; ++i)
std::cout << *i << ' ';
std::cout << '\n';
}
int
main()
{
std::vector<int> v;
std::set<int> s;
f(v);
f(s);
return 0;
}
set
允许您在迭代器上修改对象。当然,在以重新排序方式修改对象时会导致未定义行为,但有很多情况下,对象的一部分是键,其余部分可以安全地修改。老实说,我不知道为什么不允许这样做。 - Mark Ransomstd::set::erase
在它们上进行了重载。我们可以在这里应用原样规则吗? - yuri kilochek