vc6.0 下关于vector的建议(reserve())

迷南。 2022-03-28 12:47 355阅读 0赞

在看STL标准库时,作者曾说,STL中vector几乎以一种哲学的方式管理其容量的大小,所以在谈到分期摊坏的复杂度时,几乎是可以不考虑的。但在vc6.0中则不然(vc6.0对STL不完美支持是总所周知的)。代码如下:

  1. int main()
  2. {
  3. std::vector<Person> coll;
  4. // coll.reserve(100);
  5. coll.push_back(Person("test"));
  6. coll.push_back(Person("word"));
  7. coll.push_back(Person("rule"));
  8. coll.push_back(Person("map"));
  9. coll.push_back(Person("set"));
  10. coll.push_back(Person("vector"));
  11. coll.push_back(Person("list"));
  12. coll.push_back(Person("deque"));
  13. coll.push_back(Person("michael"));
  14. return 0;
  15. }

在Person类中,构造函数调用输出字符“2”,拷贝构造调用输出字符“123”,析构输出“~person”和参数。终端结果如下:

2
123
~person
test
2
123
123
~person
test
~person
word
2
123
123
123
~person
test
~person
word
~person
rule
2
123
~person
map
2
123
123
123
123
123
~person
test
~person
word
~person
rule
~person
map
~person
set
2
123
~person
vector
2
123
~person
list
2
123
~person
deque
2
123
123
123
123
123
123
123
123
123
~person
test
~person
word
~person
rule
~person
map
~person
set
~person
vector
~person
list
~person
deque
~person
michael
2
123
~person
many
148 ms
~person
test
~person
word
~person
rule
~person
map
~person
set
~person
vector
~person
list
~person
deque
~person
michael
~person
many
Press any key to continue

从结果可以看出,每push_back一次,vector的中内容就需重新拷贝一次,vetor所能容纳的元素数量编译器没做优化。

将代码中的第二行屏蔽取消,结果如下:

2
123
~person
test
2
123
~person
word
2
123
~person
rule
2
123
~person
map
2
123
~person
set
2
123
~person
vector
2
123
~person
list
2
123
~person
deque
2
123
~person
michael
2
123
~person
many
48 ms
~person
test
~person
word
~person
rule
~person
map
~person
set
~person
vector
~person
list
~person
deque
~person
michael
~person
many
Press any key to continue

此时对vector容纳元素能力进行设定,没有出现大量的拷贝,故vc6.0下建议vetor声明后即调用reserve();设置,否则插入元素的代价是巨大的。

发表评论

表情:
评论列表 (有 0 条评论,355人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vector性能利器-reserve

    `vector`是c++编程中的最常见的容器之一,可以帮助用户自动管理存储空间,需要分配存储空间的场景,可以取代原生数组. `vector`在实践的过程中,提升性能的要点就是