目录
1.string容器
vector容器是C++标准模板库提供的管理任意元素的动态顺序表容器。vector容器底层实现和string很像,都是动态的顺序表。也可以说string是vector的一种特例,它将普通的vector容器封装,增加了对字符串的操作,即对‘0’的操作,下边介绍了vector容器的一些基本操作,均参考于C++官方文档。
2.构造函数和析构函数的相关操作
#include<iostream> using namespace std; #include<vector> void TestVector1() { vector<int> v1; vector<int> v2(10); vector<int> v3(3,5); vector<int> v4{ 1,2,3,4,5,6,7,8,9,0 }; string s("hello world"); vector<char> v5(s.begin(), s.end()); vector<char> v6(v5); //拷贝构造 vector<char> v7=v6; } int main() { TestVector1(); return 0; }
3.迭代器
#include<iostream> using namespace std; #include<vector> void TestVector1() { vector<int> v4{ 1,2,3,4,5,6,7,8,9,0 }; string s("hello world"); vector<char> v5(s.begin(), s.end()); vector<int>::iterator it = v4.begin(); //正向迭代器 auto rit = v5.rbegin(); //反向迭代器 for (it = v4.begin(); it != v4.end(); it++) { cout << *it << " " ; } cout<< endl; while (rit != v5.rend()) { cout << *rit; rit++; } cout<< endl; } int main() { TestVector1(); return 0; }
4.容量相关
#include<iostream> using namespace std; #include<vector> void TestVector2() { vector<int> v4{ 1,2,3,4,5,6,7,8,9,0 }; int len=v4.size(); cout << "len:" << len << endl; v4.resize(15,11); //调整有效元素个数为15,若原对象小于15,则用11补位 cout << "v4.resize(15,11):"; for (auto e : v4) cout << e<<" "; cout << endl; v4.resize(5); //调整有效元素个数为5,若原对象大于5,则截断 cout << "v4.resize(5):"; for (auto e : v4) cout << e<<" "; cout << endl; v4.reserve(20); //调整capcity大小为20 cout<<"v4.reserve(20):" << v4.capacity()<<endl; v4.reserve(3); //调整capcity大小为3 cout << "v4.reserve(3):" << v4.capacity()<<endl; v4.clear(); //清空有效元素 bool emp = v4.empty(); //判断对象是否为空 cout << emp; } int main() { TestVector2(); return 0; }
5.元素访问相关
at和[]在使用效果方面完全一致,使用方法举例 cout << str.at(i);
区别:[]在越界访问时会触发assert断言,at会抛出异常,可供用户捕获。
#include<iostream> using namespace std; #include<vector> void TestVector3() { vector<int> v1{ 1,2,3,4,5 }; cout<<v1.at(2)<<endl; cout << v1[3] << endl; } int main() { TestVector3(); return 0; }
6.元素遍历相关
1.下标遍历
2.范围for遍历
3.迭代器遍历
#include<iostream> using namespace std; #include<vector> void TestVector1() { vector<int> v4{ 1,2,3,4,5,6,7,8,9,0 }; string s("hello world"); vector<char> v5(s.begin(), s.end()); vector<char> v6(v5); //拷贝构造 vector<char> v7=v6; vector<int>::iterator it = v4.begin(); //正向迭代器 auto rit = v5.rbegin(); //反向迭代器 for (it = v4.begin(); it != v4.end(); it++) { //正向迭代器遍历打印 cout << *it << " " ; } cout<< endl; while (rit != v5.rend()) { //反向向迭代器遍历打印 cout << *rit; rit++; } cout << endl; for (auto e : v4) { //范围for遍历打印 cout << e << " "; } cout << endl; for (int i = 0; i <v4.size(); i++) { cout << v4[i]<<" "; //下标遍历打印 } cout << endl; } int main() { TestVector1(); return 0; }
7.元素操作相关
#include<iostream> using namespace std; #include<vector> void TestVector4() { vector<int> v1{ 1,2,3,4,5 }; v1.push_back(8); //在顺序表最后插入一个数字 v1.pop_back(); //删除顺序表的最后一个数字 auto it = v1.begin(); //删除任意位置的元素 v1.erase(it); it = v1.begin(); //删除指定范围的元素 v1.erase(it , it + 2); auto i = v1.begin(); //在指定位置插入一个元素 v1.insert(i+2, 99); i=v1.begin(); //在你指定位置插入多个元素 v1.insert(i+2, 5, 88); } int main() { TestVector4(); return 0; }
8.vector模拟实现
#include<iostream>
using namespace std;
namespace vec {
template<class T>
class vector {
public:
typedef T* iterator;
typedef const T* const_iterator;
vector()
:start(nullptr)
,finish(nullptr)
,end_of_storage(nullptr)
{}
vector(size_t n,T& value=T())
:start(new T[n])
,finish(start)
,end_of_storage(start+n)
{
for (int i = 0; i < n; i++) {
*finish++=value;
}
}
vector(int n, T value = T())
:start(new T[n])
, finish(start)
, end_of_storage(start + n)
{
for (int i = 0; i < n; i++) {
*finish++ = value;
}
}
vector(const vector<T>& v)
: start(nullptr)
, finish(nullptr)
, end_of_storage(nullptr)
{
vector<T> tmp(v.cbegin(),v.cend());
this->swap(tmp);
}
template<class Iterator>
size_t distance(Iterator first, Iterator last) {
size_t count = 0;
while (first != last) {
++count;
++first;
}
return count;
}
template<class Iterator>
vector(Iterator first,Iterator last) {
size_t n = distance(first, last);
start = new T[n];
finish = start;
end_of_storage = start + n;
while (first != last) {
*finish = *first;
first++;
finish++;
}
}
///赋值运算符重载
vector<T>& operator=(vector<T> v) {
this->swap(v);
return *this;
}
~vector() {
if (start) {
delete[] start;
start = nullptr;
finish = nullptr;
end_of_storage = nullptr;
}
}
///iterator
iterator begin() {
return start;
}
iterator end() {
return finish;
}
const_iterator cbegin()const
{
return start;
}
const_iterator cend()const
{
return finish;
}
iterator rbegin() {
return end();
}
iterator rend() {
return start;
}
/容量
size_t size()const {
return finish - start;
}
size_t capcity() {
return end_of_storage - start;
}
bool empty()const {
return finish == start;
}
void resize(size_t newsize,const T& value=T()) {
size_t oldsize = size();
if (newsize <= oldsize) {
finish = start+newsize;
}
else{
if (newsize > capcity) {
reserve(newsize);
}
memset(finish, value,newsize-oldsize);
finish = start+newsize;
}
}
void reserve(size_t newcapcity) {
size_t oldcapcity = capcity();
size_t n = size();
if (newcapcity > oldcapcity) {
T* tem = new T[newcapcity];
memcpy(tem, start, sizeof(T) * size());
delete[] start;
start=tem;
finish = start + n;
end_of_storage = start + newcapcity;
}
}
/元素访问相关
T& operator[] (size_t index) {
assert(index < size());
return start[index];
}
const T& operator[] (size_t index)const
{
assert(index < size());
return start[index];
}
T& front() {
return *begin;
}
T& front()const {
return start[0];
}
T& back() {
return *(finish-1);
}
T& back()const {
return start[finish-1];
}
修改相关操作
void push_back(const T& value) {
if (finish == end_of_storage) {
reserve(capcity() * 2+3);
}
*finish = value;
++finish;
}
void pop_back() {
if (empty())
return;
--finish;
}
/insert
iterator insert(iterator pos, const T& value) {
if (pos<start || pos>finish) {
return pos;
}
if (finish == end_of_storage) {
reserve(capcity()*2);
}
auto it = finish - 1;
while (it >= pos) {
*(it + 1) = *it;
it--;
}
*pos = value;
finish++;
return pos;
}
iterator erase(iterator pos) {
if (pos < start || pos >= finish)
return end();
auto it = pos + 1;
while (it<finish) {
*(it-1)= *it;
it++;
}
finish--;
}
void clear() {
finish = start;
}
void swap(vector<T>& v) {
std::swap(start, v.start);
std::swap(finish, v.finish);
std::swap(end_of_storage, v.end_of_storage);
}
private:
iterator start;
iterator finish;
iterator end_of_storage;
};
}
void TestVector1() {
vec::vector<int> v1;
vec::vector<int> v2(10,5);
vec::vector<int> v3(v2);
int arr[]{ 1,2,3,4,5,6 };
vec::vector<int> v4(arr,arr+3);
for (auto e : v3) {
cout << e << " ";
}
cout<<endl;
for (auto it = v3.begin(); it!=v3.end(); it++) {
cout << *it<< " ";
}
cout << endl;
}
void TestVector2()
{
vec::vector<int> v1(10, 5);
v1.clear();
v1.empty();
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.pop_back();
for (auto e : v1) {
cout << e << " ";
}
cout << endl;
auto it = v1.begin();
v1.insert(it+1, 99);
for (auto e : v1) {
cout << e << " ";
}
cout << endl;
v1.erase(v1.begin());
for (auto e : v1) {
cout << e << " ";
}
cout << endl;
}
int main() {
TestVector1();
TestVector2();
return 0;
}