我看到很多c ++代码看起来像这样:
for( const_iterator it = list.begin(),
const_iterator ite = list.end();
it != ite; ++it)
Run Code Online (Sandbox Code Playgroud)
与更简洁的版本相反:
for( const_iterator it = list.begin();
it != list.end(); ++it)
Run Code Online (Sandbox Code Playgroud)
这两个约定之间的速度会有什么不同吗?由于list.end()只被调用一次,因此第一个会稍快一些.但由于迭代器是const,似乎编译器会将此测试从循环中拉出来,为两者生成等效的汇编.
c++ compiler-construction optimization iterator coding-style
作为扩展到这个问题是const_iterators更快?,我有另一个问题const_iterators.如何删除一个常量const_iterator?虽然迭代器是指针的通用形式,但仍然const_iterator和iterators是两个不同的东西.因此,我相信,我也不能用来const_cast<>转换const_iterator为iterators.
一种方法可能是您定义一个迭代器,该迭代器将元素移动到该const_iterator点的元素.但这看起来像是一个线性时间算法.
对于实现这一目标的最佳方法有什么想法吗?
说,我有一个
std::vector<SomeClass *> v;
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我需要经常在程序中访问它的元素,向前和向后循环它们.
这两者之间的访问类型最快?
迭代器访问:
std::vector<SomeClass *> v;
std::vector<SomeClass *>::iterator i;
std::vector<SomeClass *>::reverse_iterator j;
// i loops forward, j loops backward
for( i = v.begin(), j = v.rbegin(); i != v.end() && j != v.rend(); i++, j++ ){
// some operations on v items
}
Run Code Online (Sandbox Code Playgroud)
下标访问(按索引)
std::vector<SomeClass *> v;
unsigned int i, j, size = v.size();
// i loops forward, j loops backward
for( i = 0, j = size - 1; i < size && j >= …Run Code Online (Sandbox Code Playgroud) 只是想知道:当我向指针添加restrict时,我告诉编译器指针不是另一个指针的别名.我们假设我有一个类似的函数:
// Constructed example
void foo (float* result, const float* a, const float* b, const size_t size)
{
for (size_t i = 0; i < size; ++i)
{
result [i] = a [0] * b [i];
}
}
Run Code Online (Sandbox Code Playgroud)
如果编译器必须假设result可能重叠a,则必须每次重新获取.但是,正如a标记的那样const,编译器也可以假设a是固定的,因此一次取回它就可以了.
问题是,在这种情况下,使用restrict的推荐方法是什么?我当然不希望编译器a每次都重新获取,但我找不到关于如何restrict在这里工作的好信息.
据我所知,使用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来迭代字符串比使用常规字符串迭代更快 …