嵌套的STL结构

时间:2010-09-09 08:39:21

标签: c++

我想知道与编译和运行时相关的嵌套STL结构的性能。因此,如果想要实现一些嵌套结构,例如那样

vector<vector<map<int, vector<> > > >

对每个容器的访问如何影响整个执行时间?

感谢您的帮助。考虑到这个问题的一些具体链接也非常受欢迎。

我最好的。

2 个答案:

答案 0 :(得分:2)

  

每个容器的访问如何影响整个执行时间?

除了STL之外,没有什么可说的,更不用说了。 std::vector为元素提供O(1)访问权限(random access),std::map为元素提供O(log(n))访问权限。

IOW:

vector<vector<map<int, vector<int> > > > x;

int i,j,k,l;    
x[i]   // goes via std::vector, O(1)
 [j]   // goes via std::vector, O(1)
 [k]   // goes via std::map, O(log(n))
 [l];  // goes via std::vector, O(1)

大多数访问都将由编译器内联/优化。

为了帮助编译器,可以在变量中缓存一些经常访问的容器,例如:

typedef map<int, vector<int> > map_type;
typedef vector<vector< map_type > > bigvec_type;
bigvec_type x;

int i,j,k,l;

map_type &m = x[i][j];
for ( /* some loop over k and l */ ) {
   m[k][l];
}

在特定情况下,性能问题并不多。

当代码使用几个如此大的结构时(例如,将数据从一个bigvec_type容器移动到另一个容器),我的次要挑剔就是。虽然渐近性能不会改变,但编译器需要生成的代码量会非常大,因为它无法将所有必需的索引和指针放入寄存器中。为了避免这种情况,通常会尝试将逻辑上的结构拆分为多个层(类似于我的第二个代码示例),并提供仅使用1或2级容器的方法。

答案 1 :(得分:0)

表现正是您所期望的。仅仅因为它们是“嵌套的STL容器”并没有强加任何隐藏的性能变化。