在 C++ 中,"const_iterator" 与 "const iterator" 相同吗?
In C++, is "const_iterator" the same as "const iterator"?
const_iterator
和 const iterator
一样吗?如果不是有什么区别?如果是,为什么当 const iterator
已经有意义时标准使用 const_iterator
?
例如,这两个声明是否完全相同?
string& replace (const_iterator i1, const_iterator i2, const string& str);
string& replace (const iterator i1, const iterator i2, const string& str);
不,它们不一样。
与任何 const
对象一样,您无法更改 const
iterator
:
// ++it gives error below since we try to change it:
for(const std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {}
但是,您可以更改 const
iterator
指向的对象的值:
// this is ok (assuming there is at least one element in the vector):
const std::vector<int>::iterator it = vec.begin();
*it = 10;
一个const_iterator
是可变的,但是你不能改变迭代器指向的对象:
// ++it is ok below:
for(std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it) {
*it = 10; // error: `*it` is an `int const&`
}
使用 const
const_iterator
,您既不能更改迭代器也不能更改它指向的内容。
const std::vector<int>::const_iterator it = vec.begin();
++it; // error
*it = 10; // error
std::cout << *it << '\n'; // ok
一个构造的例子来说明:
struct foo {
using const_iterator = char const*;
using iterator = char*;
const_iterator cbegin() const { return data; };
const_iterator cend() const { return data + sizeof data; };
const_iterator begin() const { return cbegin(); }
const_iterator end() const { return cend(); }
iterator begin() { return data; };
iterator end() { return data + sizeof data; };
char data[2];
};
如上所示,const_iterator
和 iterator
是用户定义的类型定义。只有按照惯例,名称才会被称为它们所称的名称。使用这些约定俗成的名称在创建应该与其他 class 兼容的容器时也有帮助,因为这些类型定义通常用于创建或指定 instances/types。名称 const_iterator
和 iterator
并没有赋予这些别名 any 特殊属性。这完全取决于 class.
的创建者
const_iterator
和 const iterator
一样吗?如果不是有什么区别?如果是,为什么当 const iterator
已经有意义时标准使用 const_iterator
?
例如,这两个声明是否完全相同?
string& replace (const_iterator i1, const_iterator i2, const string& str);
string& replace (const iterator i1, const iterator i2, const string& str);
不,它们不一样。
与任何 const
对象一样,您无法更改 const
iterator
:
// ++it gives error below since we try to change it:
for(const std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {}
但是,您可以更改 const
iterator
指向的对象的值:
// this is ok (assuming there is at least one element in the vector):
const std::vector<int>::iterator it = vec.begin();
*it = 10;
一个const_iterator
是可变的,但是你不能改变迭代器指向的对象:
// ++it is ok below:
for(std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it) {
*it = 10; // error: `*it` is an `int const&`
}
使用 const
const_iterator
,您既不能更改迭代器也不能更改它指向的内容。
const std::vector<int>::const_iterator it = vec.begin();
++it; // error
*it = 10; // error
std::cout << *it << '\n'; // ok
一个构造的例子来说明:
struct foo {
using const_iterator = char const*;
using iterator = char*;
const_iterator cbegin() const { return data; };
const_iterator cend() const { return data + sizeof data; };
const_iterator begin() const { return cbegin(); }
const_iterator end() const { return cend(); }
iterator begin() { return data; };
iterator end() { return data + sizeof data; };
char data[2];
};
如上所示,const_iterator
和 iterator
是用户定义的类型定义。只有按照惯例,名称才会被称为它们所称的名称。使用这些约定俗成的名称在创建应该与其他 class 兼容的容器时也有帮助,因为这些类型定义通常用于创建或指定 instances/types。名称 const_iterator
和 iterator
并没有赋予这些别名 any 特殊属性。这完全取决于 class.