C/C++中容器vector使用方法<第二弹>

此文总结常用vector操作,是前一篇的续作!只有代码,详细请看代码中的注释。出于反爬虫的目的,你不是在http://blog.csdn.net/zhanh1218上看到的,肯定不是最新最全的。

/*********************************************************************
 * file_name: vector_test.cpp
 *
 *    Created on: 2014年6月28日 下午3:34:23
 *        Author: The_Third_Wave, Blog: http://blog.csdn.net/zhanh1218
 *         Email: [email protected]
 * Last modified: 2014年6月28日 下午3:34:23
 *********************************************************************/

#include <iostream>
#include <vector>
#include "Headers/Myfunc.h"
#include "Headers/Person.h"

void output(const std::vector<int> &vec)
// 因为是输出而不是修改,定义形参为常量引用,提高可靠性(const)和效率(&)!
{
	std::cout << "size: " << vec.size()<< ", capacity: " <<vec.capacity() << std::endl;
}

int main()
{
    std::vector<int> vec = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    pr_vector(vec);

    // 访问首位元素,原生方法之vec.front()和vec.back() 使用前一般最好做元素检查vec.size()
    std::cout << vec.front() << std::ends << vec.back() << std::endl;
    // 通过迭代器【注意:*(--vec.end())】, 使用前一般最好做元素检查vec.size()
    std::cout << *vec.begin() << std::ends << *(--vec.end()) << std::endl;

    auto a = vec.size(); // 让编译器自动分析表达式所属类型
    auto b = vec.capacity(); // 不重新分配内存的话,vector可以保存多少元素
    std::cout << "size: " << a << std::ends << "capacity: " <<b << std::endl;

    vec.reserve(50); // 分配至少能容纳n个元素的内存空间
    output(vec);

    vec.shrink_to_fit(); // 将capacity()减少为size()相同大小
    output(vec);

    vec.reserve(50); // 分配至少能容纳50个元素的内存空间
    // 以下添加元素
    for (decltype(vec.size()) ix = 0; ix != 40; ++ix) // decltype从表达式类型推导出变量类型
    {
    	vec.push_back(ix*ix);
    }
    pr_vector(vec);
    output(vec); // s输出证明没超过size,vector就不会分配超额的空间

    // 我们不分配空间,看看自动管理
    for (decltype(vec.size()) ix = 0; ix != 40; ++ix) // decltype从表达式类型推导出变量类型
	{
		vec.push_back(ix*ix);
	}
	pr_vector(vec);
	output(vec); // 输出表示分配了超额的空间,【测试表明:分配的空间为当前的2倍,也就意味着越大越浪费】

    // 以下重新初始化,开始插入操作的学习【并学习及几种赋值的操作方法】
	std::vector<int> vec2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // 重新初始化
	pr_vector(vec); pr_vector(vec2);

	std::swap(vec, vec2); // 【快速】交换两容器的数据  swap(a, b)
	pr_vector(vec); pr_vector(vec2);

    vec2.assign(vec.begin(), vec.end()); // 参数为另外一个同类型vector的迭代器
    pr_vector(vec); pr_vector(vec2);

    vec.assign({0, 0, 0, 0, 0}); // 参数为初始化列表
    pr_vector(vec);

    vec.assign(10, 1); // 替换为10个1
    pr_vector(vec);

	// vector没有向头部插入数据的原生方法,只能通过insert()方法来操作,插入位置都为指针指向的前一个位置
	// 具体有4种
    // 第一种vec.insert(p, t); p为自身的迭代器,t为需要插入的值,返回值为指向新添加元素的迭代器
    auto p = vec.insert(vec.begin() + vec.size()/2, 6688);
    // 第二种vec.insert(p, n, t); p为自身的迭代器,插入n个t,返回值为指向新添加的第一个元素的迭代器,如果n为0,则返回p
    vec.insert(p, 3, 4);
    // 第三种vec.insert(p, b, e); p为自身的迭代器,b、e为同类型其他vec对象的迭代器,返回值为指向新添加的第一个元素的迭代器。范围为空,则返回p
    vec.insert(p, vec2.crbegin(), vec2.crend()); // const 反向迭代器
    // 第四种vec.insert(p, il); p为自身的迭代器,il为元素值列表,返回值为指向新添加的第一个元素的迭代器,列表为空,则返回p
    vec.insert(vec.begin(), {9,8,7,6,5,4,3,2,1,0});
    pr_vector(vec);
    // 善用使用insert返回值,可以实现特定位置的反复插入,以上结果已说明

    // emplace操作, 【c++11】emplace_front【vector没有】、emplace、emplace_back对应push_front【vector没有】、insert、push_back
    std::vector<Person> per = {{"The_Third_Wave", 100, "Blog: http://blog.csdn.net/zhanh1218"}}; // 类初始化+vector初始化,所以{{}, {}}必须的
    per.emplace_back("The_Third_Wave", 188, "This blog: http://blog.csdn.net/zhanh1218/article/details/35569587");
    per.emplace(per.begin() + 1, Person("The_Third_Wave", 168, "Last blog: http://blog.csdn.net/zhanh1218/article/details/33323111"));
    for (auto &p: per)
    {
    	print(std::cout, p);
	}

    // 删除操作,注意编译器不检查元素是否存在,所以坑自己填
    // vec.pop_back(),vector没有pop_front()
    vec = {0, 1, 2, 3, 4, 5, 6, 7, 8 ,9};
    vec.pop_back();
    pr_vector(vec);

    // vec.erase(p)【删除迭代器p所指元素,返回值为:被删元素之后的迭代器。p指向尾部,返回尾后迭代器,如果p是尾后迭代器,那就坑死你了,恭喜!】
    vec.erase(vec.begin() + 8);
    pr_vector(vec);

    // vec.erase(b, e)【删除迭代器b,e所指范围元素,返回值为:被删元素之后的迭代器。如果e是尾后迭代器,返回的还是尾后迭代器,不坑,恭喜!】
    vec.erase(vec.begin() + 3 , vec.end() - 1);
    pr_vector(vec);

    // vec.clear()删除所有,返回值为void
    vec.clear();
    pr_vector(vec);
    std::cout << "上面有空行就对了!否则就是出错了。";
}
结果为:

0 1 2 3 4 5 6 7 8 9 
0 9
0 9
size: 10 capacity: 10
size: 10, capacity: 50
size: 10, capacity: 10
0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 
size: 50, capacity: 50
0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 
size: 90, capacity: 100
0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 
0 0 0 0 0 
1 1 1 1 1 1 1 1 1 1 
9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0 4 4 4 6688 1 1 1 1 1 
The_Third_Wave 100 Blog: http://blog.csdn.net/zhanh1218
The_Third_Wave 168 Last blog: http://blog.csdn.net/zhanh1218/article/details/33323111
The_Third_Wave 188 This blog: http://blog.csdn.net/zhanh1218/article/details/35569587
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 
0 1 2 7 

上面有空行就对了!否则就是出错了。

本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创。还有未涉及的,会不定期更新,有错误请指正。

如果你看到这篇博文时发现没有不完整,那是我为防止爬虫先发布一半的原因,请看原作者Blog。

如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址。


C/C++中容器vector使用方法<第二弹>,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。