c++中stl----vector

news/2024/7/20 16:05:08 标签: c/c++, 内存管理

1 vector是啥玩意

(1)可以使用下标访问个别的元素

(2)迭代器可以按照不同的方式遍历

(3)可以在容器的末尾增加或者删除元素

2 容器大小和容器的容量区别

(1)大小是元素的个数,容量是分配的内存大小。vector::size()容器的大小 vecto::capacity返回容器值。

(2)每次重新分配内存都会影响程序的性能,所以一般分配的容量都打羽容器的大小。

3 vector中各种初始化方法

 1 #include <vector>
 2 #include <iostream>
 3 using namespace std;
 4 int main(){
 5     int a[7]={1,2,3,4,5,6,7};
 6     vector<int> ivector(a,a+7);/*vector的赋值并不可以像数组一样方便的用花括号方便  的完成赋值,这里借用了数组来初始化这个vector
 7    初始化方式vector<elementType> intvec(begin,end);这样可以用起来看上去还是比较习惯的。*/
 8     vector<int>::iterator iter;
 9     for (iter=ivector.begin();iter!=ivector.end();iter++){
10         cout<<*iter<<" ";
11     }
12     cout<<endl;
13     ivector[5]=1;
14     /*单个vector的赋值,这个方式看上去还是和数组一样的
15     也可以这么写ivector.at(5)=1;但是就是不习惯    */
16     cout<<ivector[5]<<endl<<ivector.size()<<endl;
17     for (iter=ivector.begin();iter!=ivector.end();iter++){
18         cout<<*iter<<" ";
19     }
20     cout<<endl;
21     for(int i=0;i<5;i++){
22         cout<<ivector[i]<<" ";
23     }
24     cout<<endl;
25     return 0;
26 }
View Code

foreach用法:

 1 #include <vector>
 2 #include <algorithm>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 void print(int n)
 7 {
 8     cout<<n<<" ";
 9 }
10 
11 int main(){
12     int a[7]={1,2,3,4,5,6,7};
13     vector<int> ivector(a,a+7);
14     vector<int>::iterator iter;
15     for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历  
16     cout<<endl;
17     ivector[5]=1;
18     cout<<ivector[5]<<endl<<ivector.size()<<endl;
19     for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历  
20     return 0;
21 }
View Code

vector中存入结构体而且排序,不会自动排序

 1 #include<algorithm>
 2 #include<vector>
 3 #include<iostream>
 4 using namespace std;
 5 
 6 typedef struct rect{
 7     int id;
 8     int length;
 9     int width;
10     //重载<运算符
11     bool operator< (const rect &a) const{
12         if(id!=a.id)
13             return id<a.id;
14         else{
15             if(length!=a.length)
16                 return length<a.length;
17             else
18                 return width<a.width;
19         }
20     }
21 }Rect;
22 
23 int main(){
24     vector<Rect> vec;//vector存入结构体
25     //初始化
26     Rect rect;
27     rect.id=2;
28     rect.length=3;
29     rect.width=4;
30     //存入vector中
31     vec.push_back(rect);
32     
33     rect.id=1;
34     rect.length=2;
35     rect.width=3;
36     vec.push_back(rect);
37     //进行输出
38     vector<Rect>::iterator it=vec.begin();
39     cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;  
40     sort(vec.begin(),vec.end());
41     cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;  
42     return 0;
43 }
View Code

vector中的查找

 1 #include<algorithm>
 2 #include<vector>
 3 #include<iostream>
 4 using namespace std;
 5 int main(){
 6     vector<int> vec;
 7     vec.push_back(1);
 8     vec.push_back(2);
 9     vec.push_back(3);
10     vec.push_back(4);
11     vec.push_back(5);
12     //进行查找
13     vector<int>::iterator iter=find(vec.begin(),vec.end(),3);
14     if ( iter==vec.end())
15         cout << "Not found" << endl;
16     else
17         cout << "Found" << endl;
18     return 0;
19 }
View Code

vector中的删除

 1 #include<algorithm>
 2 #include<vector>
 3 #include<iostream>
 4 using namespace std;
 5 int main(){
 6     vector<int> vec;
 7     vec.push_back(1);
 8     vec.push_back(2);
 9     vec.push_back(3);
10     vec.push_back(4);
11     vec.push_back(5);
12     vector<int>::iterator iter=vec.begin();
13     for(;iter!=vec.end();){
14         if(*iter==3){
15             //这里注意返回是迭代器哦
16             iter=vec.erase(iter);
17         }else{
18             ++iter;
19         }
20     }
21     for(iter=vec.begin();iter!=vec.end();iter++){
22         cout<<*iter<<" ";
23     }
24     return 0;
25 }
View Code

4 vector的内存管理与效率

关于STL容器,只要超过设置的最大值就会自动增长到足以容纳用户放进入的数据大小。

(1)内部采用动态数组方式实现。

(2)注意了,通过reverse申请特定大小的内存空间的时候总是按照指数边界来增大内部缓冲区。

当进行插入等操作的时候,如果内存不够用,这个时候会重新分配1.5-2倍的新内存空间,然后将内容复制过去。这个时候性能的确就会下降。

(3)使用“交换技巧”来修整vector过剩空间。也就是把它曾经最大的容量减少到它现在需要的容量。

vector<int>(ivec).swap(ivec).

(4)使用swap方法强行释放vector所占内存

例子

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 int main(){
 5     vector<int> iVec;
 6     cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;
 7     
 8     /*1个元素,容器容量为1*/
 9     iVec.push_back(1);
10     cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;
11     
12     /*2个元素,容器容量为2*/
13     iVec.push_back(2);
14     cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;
15     
16     /*3个元素,容器容量为4*/
17     iVec.push_back(3);
18     cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;
19     
20     /*4个元素,容器容量为4*/
21     iVec.push_back(4);
22     cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;
23     
24     /*5个元素,容器容量为8*/    
25     iVec.push_back(5);
26     cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;
27     
28     /*6个元素,容器容量为8*/    
29     iVec.push_back(6);
30     cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;
31 
32     /*7个元素,容器容量为8*/    
33     iVec.push_back(7);
34     cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; 
35 
36     /*8个元素, 容器容量为8*/    
37     iVec.push_back(8);
38     cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;
39 
40     /*9个元素, 容器容量为16*/    
41     iVec.push_back(9);
42     cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;
43 
44     /* vs2005/8 容量增长不是翻倍的,如 
45     9个元素   容量9 
46     10个元素 容量13 */
47 
48     /* 测试effective stl中的特殊的交换 swap() */
49     cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;
50     vector<int>(iVec).swap(iVec);
51 
52     cout<<"临时的vector<int>对象的大小为:"<<(vector<int>(iVec)).size()<<endl;
53     cout<<"临时的vector<int>对象的容量为: " <<(vector<int>(iVec)).capacity()<<endl;
54     cout<<"交换后,当前vector的大小为:"<<iVec.size()<<endl;
55     cout<<"交换后,当前vector的容量为:"<< iVec.capacity()<<endl;
56 
57     return 0;
58 }
View Code

最后这里有点别扭,后面再看看。。。。加油骚年。。。。

 

转载于:https://www.cnblogs.com/lanjianhappy/p/8919668.html


http://www.niftyadmin.cn/n/1255850.html

相关文章

kali视频(16-20)学习

第五周 kali视频&#xff08;16-20&#xff09;学习 16.漏洞分析之数据库评估&#xff08;一&#xff09;17.漏洞分析之数据库评估&#xff08;二&#xff09;18.漏洞分析之WEB应用代理19.漏洞分析之burpsuite20.漏洞分析之fuzz工第4节 kali视频&#xff08;16-20&#xff09;学…

java void方法_Java对象类的最终void wait()方法,带有示例

java void方法对象类最终void wait() (Object Class final void wait()) This method is available in java.lang.Object.wait(). 此方法在java.lang.Object.wait()中可用。 This method causes the current thread to wait until another thread notification by calling noti…

Ubuntu 14.04 下搭建SVN服务器

Ubuntu 14.04 下搭建SVN服务器 svn:// 安装软件包&#xff1a; sudo apt-get install subversion 之后选择SVN服务文件及配置文件的放置位置。我放在了/srv下的svn目录。 cd /srv sudo mkdir svn 我的svn版本仓库叫tone_src cd /srv/svn sudo mkdir tone_src 目录建好后 创建版…

bcd码转换成ascii码_将8位ASCII转换为BCD编号| 8086微处理器

bcd码转换成ascii码Problem statement: 问题陈述&#xff1a; To convert ASCII to BCD 8-bit number using 8086 Microprocessor. 使用8086微处理器将ASCII转换为BCD 8位数字。 Algorithm: 算法&#xff1a; Load the value from memory into register AL 将内存中的值加载…

PL/SQL注册码

注册码&#xff1a; Product Code&#xff1a;4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number&#xff1a;601769 password&#xff1a;xs374ca转载于:https://www.cnblogs.com/ss-33/p/8941311.html

重温计算机组成原理:RISC、CISC(桌面CPU之争)

长期以来&#xff0c;计算机都是通过堆加硬件来提高性能的&#xff0c;这有赖于VLSI(Very Large Scale Integration)超大规模集成电路的稳定发展&#xff0c;Intel 的Gordon Moore 就曾预言&#xff0c;每24个月集成电路上可以容纳的元器件就可以增加一倍&#xff0c;对应的性能…

大数据量微服务传输_数据传输说明| 8086微处理器

大数据量微服务传输The data transfer instructions are used to transfer data from one location to another. This transfer of data can be either from register to register, register to memory or memory to register. 数据传输指令用于将数据从一个位置传输到另一位置…

第二周 ARTS

第二周 ARTS From 2019/6/24 To 2019/6/30 Type Completed Date Contents Finish Algorithm 2019-06-29 Longest Substring Without Repeating Characters [x] Review 2019-06-30 CSSAPP:A Tour of Computer:Systems [x] Tips 2019-07-01 Get Depth,PathInde…