我有问题要通过使用索引访问(使用operator [])或使用迭代器来纠正我对访问向量元素的效率的理解.
我的理解是"迭代器"比"索引访问"更有效.(我认为vector::end()也比效率更高vector::size()).
现在我编写了示例代码测量它(在Windows 7下使用Cygwin,使用g ++ 4.5.3)
索引访问循环版本(以前标记为随机访问):
int main()
{
std::vector< size_t > vec ( 10000000 );
size_t value = 0;
for( size_t x=0; x<10; ++x )
{
for ( size_t idx = 0; idx < vec.size(); ++idx )
{
value += vec[idx];
}
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
迭代器循环代码是这样的:
for (std::vector< size_t >::iterator iter = vec.begin(); iter != vec.end(); ++iter) {
value = *iter;
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶地看到"索引访问"版本更快.我用time命令"测量".数字是:
结果使用
g++ source.cpp(无优化)索引访问真正的800ms
迭代器访问
真正的2200ms …
我想开始偏爱免费(非成员)功能而不是成员函数-在本文http://www.drdobbs.com/184401197之后
我习惯于以这种方式来组织我的C ++类,这ClassName.h对于声明和ClassName.C实现都是必需的。
ClassName.h :
struct ClassName {
ClassName();
void setData( unsigned data );
};
Run Code Online (Sandbox Code Playgroud)
然后实现
ClassName.C :
#include "ClassName.h"
ClassName::ClassName() { dosomething(); };
void setData( unsigned data ) { dootherthings(); };
Run Code Online (Sandbox Code Playgroud)
那么,当我想要一个自由功能时,如何组织代码adjustClassData()?我也想将此函数放入命名空间。
假设ClassName在中namespace foo,那么我也将free函数放入其中namespace foo:
namespace foo {
void adjustClassData( ClassName & inObj );
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找namespace文件名的方面和建议。
我正在寻找一些最佳实践-因为在规定文件组织的标准中没有C ++规则。