小编Car*_*ner的帖子

向量索引访问与迭代器访问的效率

我有问题要通过使用索引访问(使用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 …

c++ iterator stl vector

8
推荐指数
1
解决办法
1万
查看次数

免费功能的C ++源代码组织

我想开始偏爱免费(非成员)功能而不是成员函数-在本文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 ++规则。

c++

4
推荐指数
1
解决办法
684
查看次数

标签 统计

c++ ×2

iterator ×1

stl ×1

vector ×1