簡介
要點
- 無開銷的隨機訪問
- 快速遍歷;適合于線性搜索
- 以攤銷后的恒定時間在末端插入
- 如果在頭部或者隨機位置的進行插入或刪除操作占主導(dǎo)地位,可能會很慢
- 如果元素類型有很高的復(fù)制/分配成本,可能會很慢(重新排序的元素需要復(fù)制/移動它們)。
- 對于大量的值來說,可能會有很長的分配時間
- std::vector 是封裝動態(tài)數(shù)組的順序容器。
- std::pmr::vector 是使用多態(tài)分配器的模板別名。
例子1
vector內(nèi)存布局
#include #include int main(){ std::vector v {2,4,5}; v.push_back(6); v.pop_back(); v[1] = 3; std::cout << v[2] << std::endl; for (int x : v) std::cout << x << ' '; std::cout << std::endl; v.reserve(8); v.resize(5, 0); for (int x : v) std::cout << x << ' '; std::cout << std::endl; std::cout << v.capacity() << std::endl; std::cout << v.size() << std::endl;}https://wandbox.org/nojs/gcc-headhttps://wandbox.org/nojs/clang-head
例子2
#include #include using namespace std;struct p2d { p2d(int x_, int y_): x{x_}, y{y_} {} int x, y;}; int main(){ vector v { p2d{2,3} }; // insert copy v.push_back( p2d{6,4} ); // construct in place with // constructor arguments v.emplace_back(9,7); // iterator to first pos v.emplace(begin(v), 5,8); for (p2d x : v) std::cout << x.x << ' ' << x.y << std::endl;}
例子3
#include #include int main(){ std::vector v {0,1,2,3,5,6}; auto i = std::begin(v) + 3; //v.insert(i,8); //std::cout << *i; // ERROR //v.erase(i); //std::cout << *i; // ERROR std::cout << *i << std::endl; i = v.insert(i,8); std::cout << *i << std::endl; i = v.erase(i); std::cout << *i << std::endl; for (int x : v) std::cout << x << ' '; std::cout << std::endl;}