我想知道与编译和运行时相关的嵌套STL结构的性能。因此,如果想要实现一些嵌套结构,例如那样
vector<vector<map<int, vector<> > > >
对每个容器的访问如何影响整个执行时间?
感谢您的帮助。考虑到这个问题的一些具体链接也非常受欢迎。
我最好的。
答案 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容器”并没有强加任何隐藏的性能变化。