【总结】C++ 基础数据结构 —— STL之动态数组(vector)用法详解



一、vector 的概念

在 C++ 中,vector是一个十分有用的容器。

  1. 它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

  2. 有些时候想开一个数组但却不知道开多大的数组比较好,因为数组的长度可能会有变化,这时候我们就需要运用到动态数组,也就是不定长数组vector。



二、vector 的基本操作

使用STL标准库的 vector 时,应包含头文件:#include <vector>

1、vector 的定义

定义int型数组:

    vector<int> vec;					//定义一个int型向量
    vector<int> vec(a);					//用 a 定义(初始化)vec
    vector<int> vec(10);				//vec有10个值为0的元素
    vector<int> vec(10,1);				//vec初始有10个值为1的元素
    vector<vector<int>> vec;			//定义一个int型二维向量
    vector<int>::iterator it;			//定义一个int型迭代器

定义string型数组:

	vector<string> vec(10,"null");			//vec初始有10个值为"null"的元素
	vector<string> vec(10,"hello");			//vec初始有10个值为"hello"的元素
	vector<string> vec(a.begin(),a.end());	//vec是a的复制	

定义结构型数组:

	struct point{ int x,y; };
	vector<point> vec;							//vec用来存坐标


2、vector 的基本操作

    vec.push_back();						//在数组的尾部添加一个元素
    vec.pop_back();							//去掉数组的最后一个元素
    vec.begin();							//得到数组头的指针,用迭代器接受
    vec.end();								//得到数组的最后一个元素+1的指针
    vec.clear();							//清空容器中所有元素
    vec.empty();							//判断容器是否为空
    vec.erase(vec.begin()+i, vec.end()+j);	//删除[i,j)区间的元素
    vec.erase(vec.begin()+i);				//删除第i+1个元素
    vec.insert(vec.begin()+i, a);			//在第i+1个元素前面插入a
    vec.insert(vec.end(), 10, a);			//尾部插入10个值为a的元素
    vec.insert(pos,data);					//在pos处插入数据
    vec.size();								//返回容器中实际元素的个数
    vec.back();								//返回尾部元素
    vec.front();							//返回头部元素
    vec.resize(n);							//数组大小变为n
    reverse(vec.begin(), vec.end())			//用函数reverse()翻转数组
    sort(vec.begin(), vec.end())			//用函数排序,默认从小排到大


三、vector 的用法


1、基本用法:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool cmp(const int &a,const int &b){
    return a>b;
}
int main(){
    vector <int> v;                         
    vector<int>::iterator it;                 //定义一个vector迭代器it 
    for(int i = 10; i >= 1; i--)             
        v.push_back(i);
    cout<<"输出:";
    for(it=v.begin(); it!=v.end(); it++)     //使用迭代器访问元素 
        cout<<*it<<" ";
    cout<<endl;
    //输出:10 9 8 7 6 5 4 3 2 1 
    it-=1;									 //最后循环会再+1,所以这里要减掉1 
    reverse(v.begin(),v.end()); 			 //翻转数组
	cout<<"翻转后:";  
	for(it=v.begin(); it!=v.end(); it++)    
        cout<<*it<<" ";
    cout<<endl;
    //翻转后:1 2 3 4 5 6 7 8 9 10
    it-=1;
    cout<<"最后一个的值为:"<<*it<<"     "<<endl;
    //最后一个的值为:10 
    v.erase(it);                             //删除最后一个元素
    cout <<"元素个数:" <<v.size() << endl;    
    //元素个数:9 
    sort(v.begin(), v.end());                    
    cout<<"排序后:";
    for(int i=0; i<v.size(); i++)         
        cout <<v[i]<< " ";					 //使用下标访问元素 
    cout<<endl;
    //排序后:1 2 3 4 5 6 7 8 9 
    v.erase(v.begin()+2);
    //结果:1 2 4 5 6 7 8 9 
    sort(v.begin(), v.end(),cmp);
    cout<<"降序排序后:";
    for(int i=0; i<v.size(); i++)         
        cout <<v[i]<< " ";					 //使用下标访问元素 
    cout<<endl;
    //降序排序后:9 8 7 6 5 4 2 1 
    v.insert(v.begin(),100) ;                 //在pos位置插入一个elem
    cout<<"第一个元素为:" <<v.front()<<endl;
    //第一个元素为:100 
    v.pop_back();                         
    cout << "元素个数:" <<v.size() << endl;
    //元素个数:8 
    v.clear();                                //vector清空
    cout <<"清空后元素个数:" << v.size() << endl;   
    //清空后元素个数:0 
    return 0;
}

输出结果:
在这里插入图片描述

2、二维数组的用法:

#include <vector>
#include <iostream>
using namespace std;
int main(){
	int a[3][2] = { 1, 2, 3, 4, 5, 6 };
	vector <int*> v;
	v.push_back(a[0]);
	v.push_back(a[1]);
	v.push_back(a[2]);
	cout << v[0][0] << endl;//1
	cout << v[0][1] << endl;//2
	cout << v[1][0] << endl;//3
	cout << v[1][1] << endl;//4
	cout << v[2][0] << endl;//5
	cout << v[2][1] << endl;//6
	return 0;
}

输出结果:
在这里插入图片描述

3、插入操作的其他用法

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
	//创建一个vector,并置入字母表的前十个字符 
	vector <char> v; 
	for(int i=0; i<10; i++ ) 
		v.push_back(i+65); 
		
	//定义一个迭代器,并初始化为第一个元素 
	vector <char>::iterator it = v.begin(); 
	v.insert(it,4,'C'); 	//插入四个C到vector中 
	
	//显示vector的内容 
	for( it = v.begin(); it != v.end(); it++ ) 
		cout << *it; 
    return 0;
}

输出结果:

CCCCABCDEFGHIJ
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一篇 预备知识 第1章 C++编程技术 2 1.1 类和对象 2 1.2 类的继承 5 1.3 函数重载 5 1.4 访问控制 7 1.5 操作符重载 8 1.6 显式类型转换 9 1.7 异常处理 13 1.8 名字空间 17 1.9 友员函数 20 1.10 内联函数 21 1.11 静态成员 22 1.12 本章小结 23 第2章 C++模板技术 25 2.1 函数模板 25 2.2 类模板 27 2.3 模板完全特化 28 2.4 函数模板重载 30 2.5 类模板继承 30 2.6 本章小结 31 第3章 C++ I/O流技术 32 3.1 I/O流类 32 3.2 标准输入输出 34 3.3 文件输入输出 36 3.4 流的格式控制 41 3.5 本章小结 45 第二篇 C++ STL泛化技术基础 第4章 C++ STL泛型库概述 48 4.1 C++ STL的发展历程 48 4.2 C++ STL的各种实现版本 49 4.2.1 HP STL 49 4.2.2 SGI STL 50 4.2.3 STLport 50 4.2.4 P.J.Plauger STL 50 4.2.5 Rouge Wave STL 50 4.3 C++ STL的Visual C++编译 50 4.4 C++ STL的体系结构 52 4.4.1 容器(Container) 52 4.4.2 迭代器(Iterator) 53 4.4.3 算法(Algorithm) 53 4.4.4 函数对象(Function Object) 54 4.4.5 适配器(Adapter) 55 4.4.6 内存分配器(Allocator) 56 4.4.7 概念(Concept)和模型(Model) 56 4.5 C++ STL存在的一些问题 57 4.6 本章小结 57 第5章 C++ STL泛化技术分析 58 5.1 算法和迭代器 58 5.1.1 算法 58 5.1.2 迭代器 61 5.1.3 函数对象 65 5.1.4 适配器 68 5.2 内存分配器和容器 74 5.2.1 内存分配器 75 5.2.2 容器 77 5.3 概念 82 5.3.1 基础性概念 82 5.3.2 容器概念 84 5.3.3 迭代器概念 86 5.3.4 函数对象概念 88 5.4 本章小结 89 第三篇 C++ STL容器技术 第6章 vector向量容器 92 6.1 vector技术原理 92 6.2 vector应用基础 94 6.3 本章小结 101 第7章 deque双端队列容器 102 7.1 deque技术原理 102 7.2 deque应用基础 108 7.3 本章小结 115 第8章 list双向链表容器 116 8.1 list技术原理 116 8.2 list应用基础 124 8.3 本章小结 131 第9章 slist单向链表容器 132 9.1 slist技术原理 132 9.2 slist应用基础 140 9.3 本章小结 148 第10章 bit_vector位向量容器 149 10.1 bit_vector技术原理 149 10.2 bit_vector应用基础 156 10.3 本章小结 161 第11章 set集合容器 162 11.1 set技术原理 162 11.2 set应用基础 181 11.3 本章小结 186 第12章 multiset多重集合容器 187 12.1 multiset技术原理 187 12.2 multiset应用基础 190 12.3 本章小结 196 第13章 map映照容器 197 13.1 map技术原理 197 13.2 map应用基础 200 13.3 本章小结 206 第14章 multimap多重映照容器 207 14.1 multimap技术原理 207 14.2 multimap应用基础 210 14.3 本章小结 216 第15章 hash_set哈希集合容器 217 15.1 hash_set技术原理 217 15.2 hash_set应用基础 230 15.3 本章小结 234 第16章 hash_map哈希映照容器 235 16.1 hash_map技术原理 235 16.2 hash_map应用基础 237 16.3 本章小结 242 第17章 string基本字符序列容器 243 17.1 string技术原理 243 17.2 string应用基础 258 17.3 本章小结 264 第18章 stack堆栈容器 265 18.1 stack技术原理 265 18.2 stack应用基础 266 18.3 本章小结 269 第19章 queue队列容器 270 19.1 queue技术原理 270 19.2 queue应用基础 271 19.3 本章小结 274 第20章 priority_queue优先队列容器 275 20.1 priority_queue技术原理 275 20.2 priority_queue应用基础 278 20.3 本章小结 281 第四篇 C++ STL算法技术 第21章 非变易算法 284 21.1 逐个容器元素for_each 284 21.2 查找容器元素find 285 21.3 条件查找容器元素find_if 286 21.4 邻近查找容器元素adjacent_find 287 21.5 范围查找容器元素find_first_of 289 21.6 统计等于某值的容器元素个数count 290 21.7 条件统计容器元素个数count_if 291 21.8 元素不匹配查找mismatch 293 21.9 元素相等判断equal 295 21.10 子序列搜索search 296 21.11 重复元素子序列搜索search_n 299 21.12 最后一个子序列搜索find_end 301 21.13 本章小结 303 第22章 变易算法 304 22.1 元素复制copy 304 22.2 反向复制copy_backward 305 22.3 元素交换swap 306 22.4 迭代器交换iter_swap 307 22.5 区间元素交换swap_ranges 308 22.6 元素变换transform 309 22.7 替换 310 22.8 条件替换replace_if 311 22.9 替换和复制replace_copy 312 22.10 条件替换和复制replace_copy_if 313 22.11 填充fill 314 22.12 n次填充fill_n 315 22.13 随机生成元素generate 316 22.14 随机生成n个元素generate_n 317 22.15 移除复制remove_copy 318 22.16 条件移除复制remove_copy_if 319 22.17 移除remove 320 22.18 条件移除remove_if 321 22.19 不连续重复元素复制unique_copy 322 22.20 剔除连续重复元素unique 324 22.21 元素反向reverse 325 22.22 反向复制reverse_copy 326 22.23 旋转rotate 327 22.24 旋转复制rotate_copy 329 22.25 随机抖动random_shuffle 330 22.26 随机采样random_sample 331 22.27 容器分割partition 333 22.28 容器稳定分割stable_partition 335 22.29 本章小结 338 第23章 排序算法 339 23.1 元素入堆push_heap 339 23.2 创建堆make_heap 343 23.3 元素出堆pop_heap 348 23.4 堆排序sort_heap 351 23.5 是否为堆is_heap 352 23.6 局部排序partial_sort 354 23.7 局部排序复制partial_sort_copy 356 23.8 排序sort 359 23.9 归并merge 366 23.10 内部归并inplace_merge 368 23.11 稳定排序stable_sort 376 23.12 是否排序is_sorted 383 23.13 第n个元素nth_element 384 23.14 下确界lower_bound 386 23.15 上确界upper_bound 388 23.16 等价区间equal_range 390 23.17 折半搜索binary_search 392 23.18 子集合includes 393 23.19 集合求并set_union 394 23.20 集合求交set_ intersection 396 23.21 集合求差set_difference 398 23.22 集合求异set_symmetric_difference 399 23.23 最小值min 401 23.24 最大值max 402 23.25 最小元素min_element 403 23.26 最大元素max_element 404 23.27 字典比较lexicographical_compare 405 23.28 下一排列组合next_permutation 406 23.29 上一排列组合prev_permutation 409 23.30 本章小结 411 第24章 数值算法 412 24.1 递增赋值iota 412 24.2 元素求和accumulate 413 24.3 两序列元素内积inner_product 414 24.4 部分元素求和partial_sum 415 24.5 相邻元素求差adjacent_difference 417 24.6 n次方计算power 419 24.7 本章小结 421 第五篇 C++ STL迭代器技术 第25章 输入输出流迭代器 424 25.1 输入流迭代器 424 25.2 输出流迭代器 426 25.3 本章小结 427 第26章 插入/反向/存储迭代器 428 26.1 向前插入迭代器 428 26.2 向后插入迭代器 429 26.3 插入迭代器 431 26.4 反向迭代器 432 26.5 反向双向迭代器 434 26.6 原始存储迭代器 435 26.7 本章小结 437 附录 STL版权说明 438
### 回答1: list、vector、map、set 是标准模板库(STL)中的容器,分别用于不同的数据存储和访问方式。 1. list(链表)是一个双向链表,可以根据需要在任意位置插入和删除元素。它没有固定大小,可以根据需要动态分配内存。由于是链表结构,所以访问元素的效率较低,但在插入和删除操作上非常高效。 2. vector动态数组)是一个支持随机访问的连续内存的数组,可以在尾部追加元素,并且能够根据需要动态分配内存。由于是连续内存,所以在访问元素时效率较高,但在插入和删除操作上相对较慢。 3. map(映射)是一个存储键值对的关联容器,通过键(key)来访问值(value)。它内部实现了一棵红黑树(平衡二叉树),保证了以对数时间复杂度执行查找、插入和删除操作。键是唯一的,可以用于对数据进行有序存储和遍历。 4. set(集合)是一个存储唯一元素的容器,内部实现也是基于红黑树。它自动对元素进行排序,并且保证元素的唯一性。可以利用set进行集合运算,如并集、交集、差集等。 这四种容器在不同的场景下有不同的使用方式: - 如果需要经常进行插入和删除操作,并且不关心元素的顺序,则可以选择使用list。 - 如果需要频繁访问元素,不需要进行插入和删除操作,或者只在尾部进行插入和删除,则可以选择使用vector。 - 如果需要按照键来查找和存储数据,则可以选择使用map。 - 如果需要存储唯一元素,并且需要对元素进行排序和集合运算,则可以选择使用set。 当然,具体的选择还会根据实际需求和性能要求进行权衡。 ### 回答2: list、vector、map、set都是C++标准模板库(STL)中的容器,有着不同的特点和用法。 1. list(链表)是双向链表的实现,其中的元素可以随意插入和删除。它没有随机访问的功能,只能通过迭代器进行跳跃式访问。它适用于需要频繁的插入和删除操作,并且不需要随机访问的场景。 2. vector(向量)是动态数组的实现,支持随机访问。在vector中进行插入和删除操作需要移动其他元素,所以效率可能会低于list。但是它具有随机访问的能力,并且在末尾插入和删除元素的效率较高。vector适用于需要频繁的随机访问和在末尾插入删除元素的场景。 3. map(映射)是一种由键和值对组成的容器,通过键进行查找和插入操作。map内部通过红黑树实现,所以键值对是按照键的顺序来存储的。map中的每个键是唯一的,如果插入一个已存在的键,将会覆盖原有的值。map适用于需要按键进行查找的场景。 4. set(集合)是一种由唯一元素组成的容器,元素按照一定的顺序进行存储。set内部也是通过红黑树实现,所以元素是按照一定顺序排列的。set中的元素是唯一的,插入重复的元素将会被忽略。set适用于需要维护一组唯一元素并进行一些集合操作(如并集、交集等)的场景。 总结而言,list适用于频繁的插入和删除操作,vector适用于频繁的随机访问和末尾插入删除操作,而map和set适用于按键进行查找或维护一组唯一元素的场景。根据实际需求选择适当的容器可以提高代码的效率。 ### 回答3: list、vector、map和set是C++标准库中常用的容器类,它们分别用于不同的存储和访问数据的需求。 1. list(链表): - 使用双向链表实现,支持快速的插入和删除操作; - 不支持随机访问,只能通过迭代器依次访问元素; - 元素的添加和删除不会导致迭代器失效; - 适用于需要频繁插入和删除元素的场景,但对于随机访问的需求较少。 2. vector动态数组): - 使用动态数组实现,支持随机访问; - 在尾部插入或删除元素的时间复杂度为常数,其他位置的插入和删除操作需要移动部分元素; - 内存分配是连续的,支持快速的随机访问; - 在需要经常随机访问元素的场景下使用较多。 3. map(有序映射): - 使用红黑树实现,基于键值对的有序映射; - 插入和查找操作的时间复杂度为对数时间复杂度; - map中的元素按照键值的顺序进行排列; - 适用于需要进行查找操作的场景,如字典、索引等。 4. set(有序集合): - 使用红黑树实现,表示一个有序的不重复元素集合; - 插入和查找操作的时间复杂度为对数时间复杂度; - set中的元素按照从小到大的顺序排列; - 适用于需要维护有序不重复元素的场景。 总结: - list适用于频繁插入和删除元素的场景; - vector适用于需要经常随机访问元素的场景; - map适用于需要查找操作的场景,按照键值有序排列; - set适用于需要维护有序不重复元素的场景。 实际使用中,根据具体的需求选择合适的容器可以提高程序的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值