C++中的Vector与map

来源:互联网 发布:数据分析前途 编辑:程序博客网 时间:2024/05/20 22:30

Vector:是标准库vector类型
使用vector,必须包含适当的头文件

#include<vector>

定义和初始化

vector<T> v1   //v1是一个空的vectorvector<T> v2(v1) //v2中包含v1的所有元素的副本vector<T> v2 = v1  //等价于v2(v1)

赋值

vector<string> v1{"hi"} //列表初始化,v1有一个元素vector<string> v2("hi")   //错误,不能用一个字符串字面值创建vector对象vector<string> v3{10}   //有10个默认初始化的值vector<string> v4{10,"hi"}  //有10个值为"hi"的元素

注意:

vector<int> ivec(10)   //10个元素,每一个元素均为0vector<string> svec(10) //10个元素。每一个都是空string对象//给vector赋值用{},涉及到vector中数量的时候用()

Vector对象最重要的几种操作
1. v.push_back(t) 在数组的最后添加一个值为t的数据
2. v.size() 当前使用数据的大小
3. v.empty() 判断vector是否为空
4. v[n] 返回v中位置为n的元素
5. v1=v2 把v1的元素替换为v2元素的副本
6. v1==v2 判断v1与v2是否相等
7. !=、<、<=、>、>= 保持这些操作符惯有含义
添加元素

#include<vector>vector<int> v1for(int i = 1;i!= 100;i++){    v1.push_back(i)}

不能用下标形式添加元素

vector<int> ivecfor(decltype(ivec.size()) ix = 0;ix!= 10;ix++){    ivec[ix] = ix   //严重错误,ivec不包含任何的元素    ivec.push_back(ix)  //正确,添加一个新元素,新元素为ix} 

注意:只能对确知已存在的元素执行下标操作

vector<int> v1 //空的vector对象cout<<v1[0]  //错误,v1不含有很合元素vector<int> v2(10)  //含有10个元素的vector对象cout<<v2[10]  //错误:v2的合法索引值是0到9

capacity和size
容器的size是指它已经保存的元素的数目,而capacity是指在不分配新的内存空间的前提下,它最多可以保存多少元素

vector<int> iveccout<<"ivec:size"<<ivec.size()<<"capacity"<<ivec.capacity()<<end//size为0,最后的实现两个都为0,标准库中一个空的vector的capacity也为0//总结:只要操作没有超出vector的容量,vector就不能重新分配内存空间,vector的实现策略是每次需要分配新的内存空间时将当前容量翻倍

map:map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果
map是一种关联容器,关联容器支持高效的关键字查询和访问,两个主要的关联容器就是map和set,map中的元素是一些关键字-值对,关键字起到索引的作用,值则表示与关键字相关联的数据。
1.map最基本的构造函数;

   map<string , int >mapstring;         map<int ,string >mapint;   map<sring, char>mapstring;         map< char ,string>mapchar;   map<char ,int>mapchar;            map<int ,char >mapint;   //  map<char ,int>mapchar; 定义的map中,第一个是关键字的类型,第二个是值的类型,这个关键字是char类型,值是int类型

2.map添加数据;

map<int ,string> maplive;  maplive.insert(pair<int,string>(102,"aclive"));maplive.insert(map<int,string>::value_type(321,"hai"));maplive[112]="April";//map中最简单的插入添加!慎用,如果不存在,会把新元素插入

3.map中元素的查找:
find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。

   map<int ,string >::iterator l_it;;    l_it=maplive.find(112);   if(l_it==maplive.end())                cout<<"we do not find 112"<<endl;   else cout<<"wo find 112"<<endl;

4,map中元素的删除:
如果删除112;

   map<int ,string >::iterator l_it;;   l_it=maplive.find(112);   if(l_it==maplive.end())        cout<<"we do not find 112"<<endl;   else  maplive.erase(l_it);  //delete 112;

5,map中 swap的用法:
Map中的swap不是一个容器中的元素交换,而是两个容器交换;
For example:

 #include <map>  #include <iostream>  using namespace std;  int main( )  {      map <int, int> m1, m2, m3;      map <int, int>::iterator m1_Iter;      m1.insert ( pair <int, int>  ( 1, 10 ) );      m1.insert ( pair <int, int>  ( 2, 20 ) );      m1.insert ( pair <int, int>  ( 3, 30 ) );      m2.insert ( pair <int, int>  ( 10, 100 ) );      m2.insert ( pair <int, int>  ( 20, 200 ) );      m3.insert ( pair <int, int>  ( 30, 300 ) );   cout << "The original map m1 is:";   for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )      cout << " " << m1_Iter->second;      cout   << "." << endl;   // This is the member function version of swap   //m2 is said to be the argument map; m1 the target map   m1.swap( m2 );   cout << "After swapping with m2, map m1 is:";   for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )      cout << " " << m1_Iter -> second;      cout  << "." << endl;   cout << "After swapping with m2, map m2 is:";   for ( m1_Iter = m2.begin( ); m1_Iter != m2.end( ); m1_Iter++ )      cout << " " << m1_Iter -> second;      cout  << "." << endl;   // This is the specialized template version of swap   swap( m1, m3 );   cout << "After swapping with m3, map m1 is:";   for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )      cout << " " << m1_Iter -> second;      cout   << "." << endl;}

6.map的sort问题:
Map中的元素是自动按key升序排序,所以不能对map用sort函数:

  #include <map>  #include <iostream>  using namespace std; int main( ) {   map <int, int> m1;   map <int, int>::iterator m1_Iter;   m1.insert ( pair <int, int>  ( 1, 20 ) );   m1.insert ( pair <int, int>  ( 4, 40 ) );   m1.insert ( pair <int, int>  ( 3, 60 ) );   m1.insert ( pair <int, int>  ( 2, 50 ) );   m1.insert ( pair <int, int>  ( 6, 40 ) );   m1.insert ( pair <int, int>  ( 7, 30 ) );   cout << "The original map m1 is:"<<endl;   for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )      cout <<  m1_Iter->first<<" "<<m1_Iter->second<<endl;}  The original map m1 is:  1 20  2 50  3 60  4 40  6 40  7 30

set:也是一种关联容器
定义

set<string> s1 = {"hello","world"}

添加元素

set s1s1.insert("hello")s1.insert("world")

元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。

set<int> s;s.erase(2);        //删除键值为2的元素s.clear();

5.元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。

set<int> s;set<int>::iterator it;it=s.find(5);    //查找键值为5的元素if(it!=s.end())    //找到       cout<<*it<<endl;else            //未找到       cout<<"未找到";

对set常用的操作
1.元素插入:insert()
2.中序遍历:类似vector遍历(用迭代器)
3.反向遍历:利用反向迭代器reverse_iterator

    set<int> s;    ......    set<int>::reverse_iterator rit; //反向遍历    for(rit=s.rbegin();rit!=s.rend();rit++)
    set<int> s;    ......    set<int>::iterator rit; //正向遍历    for(rit=s.begin();rit!=s.end();rit++)
0 0
原创粉丝点击