1 vector是啥玩意

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

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

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

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

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

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

3 vector中各种初始化方法

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

foreach用法:

 #include <vector>
#include <algorithm>
#include <iostream>
using namespace std; void print(int n)
{
cout<<n<<" ";
} int main(){
int a[7]={1,2,3,4,5,6,7};
vector<int> ivector(a,a+7);
vector<int>::iterator iter;
for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历
cout<<endl;
ivector[5]=1;
cout<<ivector[5]<<endl<<ivector.size()<<endl;
for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历
return 0;
}

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

 #include<algorithm>
#include<vector>
#include<iostream>
using namespace std; typedef struct rect{
int id;
int length;
int width;
//重载<运算符
bool operator< (const rect &a) const{
if(id!=a.id)
return id<a.id;
else{
if(length!=a.length)
return length<a.length;
else
return width<a.width;
}
}
}Rect; int main(){
vector<Rect> vec;//vector存入结构体
//初始化
Rect rect;
rect.id=2;
rect.length=3;
rect.width=4;
//存入vector中
vec.push_back(rect); rect.id=1;
rect.length=2;
rect.width=3;
vec.push_back(rect);
//进行输出
vector<Rect>::iterator it=vec.begin();
cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;
sort(vec.begin(),vec.end());
cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;
return 0;
}

vector中的查找

 #include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
//进行查找
vector<int>::iterator iter=find(vec.begin(),vec.end(),3);
if ( iter==vec.end())
cout << "Not found" << endl;
else
cout << "Found" << endl;
return 0;
}

vector中的删除

 #include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
vector<int>::iterator iter=vec.begin();
for(;iter!=vec.end();){
if(*iter==3){
//这里注意返回是迭代器哦
iter=vec.erase(iter);
}else{
++iter;
}
}
for(iter=vec.begin();iter!=vec.end();iter++){
cout<<*iter<<" ";
}
return 0;
}

4 vector的内存管理与效率

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

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

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

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

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

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

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

例子

 #include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> iVec;
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; /*1个元素,容器容量为1*/
iVec.push_back(1);
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; /*2个元素,容器容量为2*/
iVec.push_back(2);
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; /*3个元素,容器容量为4*/
iVec.push_back(3);
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; /*4个元素,容器容量为4*/
iVec.push_back(4);
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; /*5个元素,容器容量为8*/
iVec.push_back(5);
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; /*6个元素,容器容量为8*/
iVec.push_back(6);
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; /*7个元素,容器容量为8*/
iVec.push_back(7);
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; /*8个元素, 容器容量为8*/
iVec.push_back(8);
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; /*9个元素, 容器容量为16*/
iVec.push_back(9);
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl; /* vs2005/8 容量增长不是翻倍的,如
9个元素 容量9
10个元素 容量13 */ /* 测试effective stl中的特殊的交换 swap() */
cout<<"容器大小:"<<iVec.size()<<"容量:"<<iVec.capacity()<<endl;
vector<int>(iVec).swap(iVec); cout<<"临时的vector<int>对象的大小为:"<<(vector<int>(iVec)).size()<<endl;
cout<<"临时的vector<int>对象的容量为: " <<(vector<int>(iVec)).capacity()<<endl;
cout<<"交换后,当前vector的大小为:"<<iVec.size()<<endl;
cout<<"交换后,当前vector的容量为:"<< iVec.capacity()<<endl; return 0;
}

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

c++中stl----vector的更多相关文章

  1. 转:用STL中的vector动态开辟二维数组

    用STL中的vector动态开辟二维数组 源代码:#include <iostream>#include <vector>using namespace std;int mai ...

  2. STL中的Vector相关用法

    STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int> ...

  3. (转)C++ STL中的vector的内存分配与释放

    C++ STL中的vector的内存分配与释放http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html 1.vector的内 ...

  4. C++STL中的vector的简单实用

    [原创] 使用C++STL中的vector, #include <stdio.h> #include<stdlib.h> #include<vector> usin ...

  5. STL中的vector实现邻接表

    /* STL中的vector实现邻接表 2014-4-2 08:28:45 */ #include <iostream> #include <vector> #include  ...

  6. 数据结构与算法(3)- C++ STL与java se中的vector

    声明:虽然本系列博客与具体的编程语言无关.但是本文作者对c++相对比较熟悉,其次是java,所以难免会有视角上的偏差.举例也大多是和这两门语言相关. 上一篇博客概念性的介绍了vector,我们有了大致 ...

  7. STL—Vector简介

    有关C++ STL 中的vector向量的用法(代码示例) 一. 简介 Vector是一个称为向量的顺序容器(不明白顺序容器与关联容器的可以Google). 二. 特点 1. 动态(相当于一个动态数组 ...

  8. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  9. STL vector

    STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...

  10. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

随机推荐

  1. CentOS 6.4安装Puppet

    CentOS安装Puppet   环境介绍:centos6.4x64 採用CentOS-6.4-x86_64-minimal.iso最小化安装   puppet版本号3.6.2.ruby1.8.7,f ...

  2. MacOS 修改主机名

    修改主机名 sudo scutil --set HostName xxx 修改共享名 sudo scutil --set ComputerName xxx

  3. “ 不确定 "限制值的使用

    前言 前篇文章解释了限制值的五种类型以及获取它们的方法.但是对于其中可能不确定的类型( 45类型 ),当限制值获取函数返回-1的时候,我们无法仅通过这个函数返回值-1来判断是限制值获取失败还是限制值是 ...

  4. Edit conflicts

    Edit conflicts 当副本修改处和服务器版本相同处被修改并下载到本地时,就会发生文件冲突. 操作步骤如下所示: Ø 执行"SVN Update" Ø 若发生冲突,会出现如 ...

  5. Sping中Bean配置的深入探讨

    一.p命名空间的使用 Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性.使用 p 命名空间后,基于 XML 的配 ...

  6. Hadoop实战-使用Eclipse开发Hadoop API程序(四)

    一.准备运行所需Jar包 1)avro-1.7.4.jar 2)commons-cli-1.2.jar 3)commons-codec-1.4.jar 4)commons-collections-3. ...

  7. 【C语言天天练(十九)】restrict关键词

    引言:在内核的系统调用函数里,常常遇到函数的參数使用restrict限定词限定的情况,以下就对该关键词做个总结. 1.restrict关键词是C99特性才加入的,因此在编译使用含有该限定词的程序时,一 ...

  8. linux定期判断网站可否打开

      wget http://www.shopindream.de/200.php --timeout=2 c_monitor=$? rm -rf 200.php if [ ! $c_monitor = ...

  9. 【Effective C++】构造/析构/赋值运算

    条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函 ...

  10. 解决Android Studio Fetching Android SDK component information失败问题【转】

    本文转载自:http://blog.csdn.net/isesar/article/details/41908089 Android Studio 安装完成后,如果直接启动,Android Studi ...