如果您想要具有'C'数组的性能,但又希望增加安全性和类似STL的语义(迭代器、
begin()
和
end()
等),请使用
boost::array
。
基本上,它是'C'-数组的模板包装器,具有一些可通过NDEBUG
禁用的范围检查断言(还有一些std::range_error
异常抛出的访问器)。
我使用类似以下的东西:
boost::array<boost::array<float,4>,4> m;
替代
float m[4][4];
一直以来,它都表现出色(使用适当的typedef可以减少冗余代码)。
更新:在这里的评论中讨论了boost::array
和boost::multi_array
之间相对性能的问题。我想指出,在Debian/Lenny amd64上使用g++ -O3 -DNDEBUG
编译该代码,配备Q9450和1333MHz DDR3 RAM,boost::multi_array
需要3.3秒,而boost::array
只需要0.6秒。
#include <iostream>
#include <time.h>
#include "boost/array.hpp"
#include "boost/multi_array.hpp"
using namespace boost;
enum {N=1024};
typedef multi_array<char,3> M;
typedef array<array<array<char,N>,N>,N> C;
static void clear(M& m);
static void clear(C& c);
int main(int,char**)
{
const clock_t t0=clock();
{
M m(extents[N][N][N]);
clear(m);
}
const clock_t t1=clock();
{
std::auto_ptr<C> c(new C);
clear(*c);
}
const clock_t t2=clock();
std::cout
<< "multi_array: " << (t1-t0)/static_cast<float>(CLOCKS_PER_SEC) << "s\n"
<< "array : " << (t2-t1)/static_cast<float>(CLOCKS_PER_SEC) << "s\n";
return 0;
}
void clear(M& m)
{
for (M::index i=0;i<N;i++)
for (M::index j=0;j<N;j++)
for (M::index k=0;k<N;k++)
m[i][j][k]=1;
}
void clear(C& c)
{
for (int i=0;i<N;i++)
for (int j=0;j<N;j++)
for (int k=0;k<N;k++)
c[i][j][k]=1;
}
throw 0
?! Why notstd::out_of_range("matrix indices out of range")
- Alexis WilkeBoundsMatrix<bool>
不起作用。无论如何,这根本不是“向量的范围检查版本”。您甚至没有提供迭代器,为此提供范围检查要困难得多。 - D Drmmr