13天带你了解C++ ---DAY10 C++之vector

目录

1.string容器

2.构造函数和析构函数的相关操作

3.迭代器

4.容量相关

5.元素访问相关

6.元素遍历相关

7.元素操作相关

 8.vector模拟实现


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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗二叉树_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值