据我所知,使用const和&所有其他花哨的C++东西,正如我在视频中所说的"帮助编译器"时所说的Bjarne Stroustrup.我理解如何&尽可能使用(引用)可以帮助提高程序的效率,但有一件事我不明白是多么const_iterator有用.假设我使用
#include <string>
#include <iostream>
int main()
{
const std::string s = "Vote for Pat Buchanan in 2016";
for (std::string::const_iterator i1(s.cbegin()), i2(s.cend()); i1 != i2; ++i1)
std::cout << *i1 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代替
#include <string>
#include <iostream>
int main()
{
const std::string s = "Vote for Pat Buchanan in 2016";
for (std::string::iterator i1(s.begin()), i2(s.end()); i1 != i2; ++i1)
std::cout << *i1 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
两者都有效.前者如何更有效率?如何通过使用const_iteratorgo来迭代字符串比使用常规字符串迭代更快iterator?它们不是相同的数据结构吗?为什么需要单独的数据结构来迭代整个程序中不变的容器,而不是迭代通过非常量的容器?
例如,如果我编写了自己的StringCool使用节点的字符串类
node
{
char c;
node * next, * previous;
}
Run Code Online (Sandbox Code Playgroud)
迭代它,我不明白为什么我需要一个不同类型的节点来迭代通过的常量实例StringCool.关于StringCool实例的常量版本,唯一不同的是该类不允许写入.我可以给它一个带字段的节点
const char c;
const node * next, * previous;
Run Code Online (Sandbox Code Playgroud)
但我不知道如何迭代这些节点的链表会更快.
Related question:在C++中创建类时,是否可以定义在声明类的实例时会发生什么const?
const_iterator不存在使程序更快,它存在类型安全.如果您希望允许代码迭代容器,但您希望确保它不会修改内容,则可以提供该代码const_iterator.
为什么需要单独的数据结构来迭代整个程序中不变的容器,而不是迭代通过非常量的容器?
您不一定 需要 const_iterator迭代容器,但使用单独的迭代器类型可以让您更好地表达您的意图.如果你想在不改变任何东西的情况下进行迭代,那么使用一个const_iterator明确的意图.
如果我有一个数组,int我可以传递int*给想要访问它的函数,但如果我想确保函数不修改数组元素,我会通过const int*.如果我有一个数组,const int那么我必须通过,const int*因为我不能int*使用一个可疑的(也可能是危险的)强制转换的数组非const .
您可以使用const_iterator(或其等价物)执行const或非const对象的非修改遍历.您只能使用mutable iterator遍历非const对象,以防止您尝试修改const容器的元素.
相关问题:在C++中创建类时,是否可以定义当类的实例被声明为const时会发生什么?
不,无论对象是否声明为const,都会调用相同的构造函数,并且*this构造函数期间的类型始终为非const.