zoukankan      html  css  js  c++  java
  • STL—vector容器

    vector容器

    1 vector基本概念

    功能:

    • vector数据结构和数组非常相似,也称为单端数组

    vector与普通数组区别:

    • 不同之处在于数组是静态空间,而vector可以动态扩展

    动态扩展:

    • 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间

    • vector容器的迭代器是支持随机访问的迭代器

    2 vector构造函数

    功能描述:

    • 创建vector容器

    函数原型:

    • vector<T> v; //采用模板实现类实现,默认构造函数
    • vector(v.begin(), v.end()); //将v[begin(), end())(注意前闭后开)区间中的元素拷贝给本身。
    • vector(n, elem); //构造函数将n个elem拷贝给本身。
    • vector(const vector &vec); //拷贝构造函数。

    示例:

    #include <vector>
    
    void printVector(vector<int>& v) {
    
    	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    
    void test01()
    {
    	vector<int> v1; //无参构造
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    	}
    	printVector(v1);
    
    	vector<int> v2(v1.begin(), v1.end());
    	printVector(v2);
    
    	vector<int> v3(10, 100);
    	printVector(v3);
    	
    	vector<int> v4(v3);
    	printVector(v4);
    }
    
    int main() {
    
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    

    总结:vector的多种构造方式没有可比性,灵活使用即可

    3 vector赋值操作

    功能描述:

    • 给vector容器进行赋值

    函数原型:

    • vector& operator=(const vector &vec);//重载等号操作符

    • assign(begin, end); //将[begin, end)区间中的数据拷贝赋值给本身。

    • assign(n, elem); //将n个elem拷贝赋值给本身。

    示例:

    #include <vector>
    
    void printVector(vector<int>& v) {
    
    	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    
    //赋值操作
    void test01()
    {
    	vector<int> v1; //无参构造
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    	}
    	printVector(v1);
    
    	vector<int>v2;
    	v2 = v1;
    	printVector(v2);
    
    	vector<int>v3;
    	v3.assign(v1.begin(), v1.end());
    	printVector(v3);
    
    	vector<int>v4;
    	v4.assign(10, 100);
    	printVector(v4);
    }
    
    int main() {
    
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    
    

    总结: vector赋值方式比较简单,使用operator=,或者assign都可以

    4 vector容量和大小

    功能描述:

    • 对vector容器的容量和大小操作

    函数原型:

    • empty(); //判断容器是否为空

    • capacity(); //容器的容量

    • size(); //返回容器中元素的个数

    • resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

      ​ //如果容器变短,则末尾超出容器长度的元素被删除。

    • resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

      ​ //如果容器变短,则末尾超出容器长度的元素被删除

    示例:

    #include <vector>
    
    void printVector(vector<int>& v) {
    
    	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    
    void test01()
    {
    	vector<int> v1;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    	}
    	printVector(v1);
    	if (v1.empty())
    	{
    		cout << "v1为空" << endl;
    	}
    	else
    	{
    		cout << "v1不为空" << endl;
    		cout << "v1的容量 = " << v1.capacity() << endl;
    		cout << "v1的大小 = " << v1.size() << endl;
    	}
    
    	//resize 重新指定大小 ,若指定的更大,默认用0填充新位置,可以利用重载版本替换默认填充
    	v1.resize(15,10);
    	printVector(v1);
    
    	//resize 重新指定大小 ,若指定的更小,超出部分元素被删除
    	v1.resize(5);
    	printVector(v1);
    }
    
    int main() {
    
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    
    

    总结:

    • 判断是否为空 --- empty
    • 返回元素个数 --- size
    • 返回容器容量 --- capacity
    • 重新指定大小 --- resize

    5 vector插入和删除

    功能描述:

    • 对vector容器进行插入、删除操作

    函数原型:

    • push_back(ele); //尾部插入元素ele
    • pop_back(); //删除最后一个元素
    • insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
    • insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele
    • erase(const_iterator pos); //删除迭代器指向的元素
    • erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
    • clear(); //删除容器中所有元素

    示例:

    #include <vector>
    
    void printVector(vector<int>& v) {
    
    	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    
    //插入和删除
    void test01()
    {
    	vector<int> v1;
    	//尾插
    	v1.push_back(10);
    	v1.push_back(20);
    	v1.push_back(30);
    	v1.push_back(40);
    	v1.push_back(50);
    	printVector(v1);
    	//尾删
    	v1.pop_back();
    	printVector(v1);
    	//插入
    	v1.insert(v1.begin(), 100);
    	printVector(v1);
    
    	v1.insert(v1.begin(), 2, 1000);
    	printVector(v1);
    
    	//删除
    	v1.erase(v1.begin());
    	printVector(v1);
    
    	//清空
    	v1.erase(v1.begin(), v1.end());
    	v1.clear();
    	printVector(v1);
    }
    
    int main() {
    
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    

    总结:

    • 尾插 --- push_back
    • 尾删 --- pop_back
    • 插入 --- insert (位置迭代器)
    • 删除 --- erase (位置迭代器)
    • 清空 --- clear

    6 vector数据存取

    功能描述:

    • 对vector中的数据的存取操作

    函数原型:

    • at(int idx); //返回索引idx所指的数据
    • operator[]; //返回索引idx所指的数据
    • front(); //返回容器中第一个数据元素
    • back(); //返回容器中最后一个数据元素

    示例:

    #include <vector>
    
    void test01()
    {
    	vector<int>v1;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    	}
    
    	for (int i = 0; i < v1.size(); i++)
    	{
    		cout << v1[i] << " ";
    	}
    	cout << endl;
    
    	for (int i = 0; i < v1.size(); i++)
    	{
    		cout << v1.at(i) << " ";
    	}
    	cout << endl;
    
    	cout << "v1的第一个元素为: " << v1.front() << endl;
    	cout << "v1的最后一个元素为: " << v1.back() << endl;
    }
    
    int main() {
    
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    

    总结:

    • 除了用迭代器获取vector容器中元素,[ ]和at也可以
    • front返回容器第一个元素
    • back返回容器最后一个元素

    7 vector互换容器

    功能描述:

    • 实现两个容器内元素进行互换

    函数原型:

    • swap(vec); // 将vec与本身的元素互换

    示例:

    #include <vector>
    
    void printVector(vector<int>& v) {
    
    	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    
    void test01()
    {
    	vector<int>v1;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    	}
    	printVector(v1);
    
    	vector<int>v2;
    	for (int i = 10; i > 0; i--)
    	{
    		v2.push_back(i);
    	}
    	printVector(v2);
    
    	//互换容器
    	cout << "互换后" << endl;
    	v1.swap(v2);
    	printVector(v1);
    	printVector(v2);
    }
    
    void test02()
    {
    	vector<int> v;
    	for (int i = 0; i < 100000; i++) {
    		v.push_back(i);
    	}
    
    	cout << "v的容量为:" << v.capacity() << endl;
    	cout << "v的大小为:" << v.size() << endl;
    
    	v.resize(3);
    
    	cout << "v的容量为:" << v.capacity() << endl;
    	cout << "v的大小为:" << v.size() << endl;
    
        //巧用swap收缩内存
        //vector<int>(v)  创建一个匿名对象   swap(v) 容器互换(本质上是指针指向互换)
        //匿名对象在当前行执行完之后,系统会帮助我们回收内存
    	vector<int>(v).swap(v); //匿名对象
    
    	cout << "v的容量为:" << v.capacity() << endl;
    	cout << "v的大小为:" << v.size() << endl;
    }
    
    int main() {
    
    	test01();
    
    	test02();
    
    	system("pause");
    
    	return 0;
    }
    
    

    总结:swap可以使两个容器互换,可以达到实用的收缩内存效果

    8 vector预留空间

    功能描述:

    • 减少vector在动态扩展容量时的扩展次数

    函数原型:

    • reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。

    示例:

    #include <vector>
    
    void test01()
    {
    	vector<int> v;
    
    	//预留空间
    	v.reserve(100000);
    
    	int num = 0;//统计开辟空间次数
    	int* p = NULL;
    	for (int i = 0; i < 100000; i++) {
    		v.push_back(i);
    		if (p != &v[0]) {
    			p = &v[0];
    			num++;
    		}
    	}
    
    	cout << "num:" << num << endl;
    }
    
    int main() {
    
    	test01();
        
    	system("pause");
    
    	return 0;
    }
    

    总结:如果数据量较大,可以一开始利用reserve预留空间

    吾生也有涯,而知也无涯
  • 相关阅读:
    使用JDBC连接MySql时出现:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration
    Mysql Lost connection to MySQL server at ‘reading initial communication packet', system error: 0
    mysql-基本命令
    C# 监听值的变化
    DataGrid样式
    C# 获取当前日期时间
    C# 中生成随机数
    递归和迭代
    PHP 时间转几分几秒
    PHP 根据整数ID,生成唯一字符串
  • 原文地址:https://www.cnblogs.com/daimasanjiaomao/p/13955956.html
Copyright © 2011-2022 走看看