一、vector使用

1、常用操作

(1)a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a // 复制
(2)a.assign(4,2); //是a只含4个元素,且每个元素为2
(3)a.back(); //返回a的最后一个元素
(4)a.front(); //返回a的第一个元素
(5)a[i]; //返回a的第i个元素,当且仅当a[i]存在2013-12-07
(6)a.clear(); //清空a中的元素
(7)a.empty(); //判断a是否为空,空则返回ture,不空则返回false
(8)a.pop_back(); //删除a向量的最后一个元素
(9)a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它);
a.erase(it); erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器
(10)a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5
(11)a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
(12)a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
(13)a.insert(a.begin()+1,b+3,b+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8 ,插入元素后为1,4,5,9,2,3,4,5,9,8
(14)a.size(); //返回a中元素的个数;
(15)a.capacity(); //返回a在内存中总共可以容纳的元素个数
(16)a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机
(17)a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2
(18)a.reserve(100); //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才 显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能)
(19)a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换
(20)a==b; //b为向量,向量的比较操作还有!=,>=,<=,>,<;
(21)sort(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列
(22)reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1
(23)copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开 始复制,覆盖掉原有元素
(24)find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

  • 补充
    c++中vector find使用
    不同于map(map有find方法),vector本身是没有find这一方法,其find是依靠algorithm来实现的。

2、遍历vector

  • (1)迭代器遍历

    #include <iostream>
    #include <vector>
    using namespace std;
    // vector容器遍历方式1 —— 迭代器遍历
    void traverseVector_2(vector<int> v)
    {
      // 注:如果参数为const vector<int> 需要用const_iterator
      vector<int>::iterator it = v.begin();
      // vector<int>::const_iterator iter=v.begin();
      for(; it != v.end(); ++it)
      {
          cout<<(*it)<<" ";
      }
      cout<<endl;
    }
  • (2)下标遍历

    // vector容器遍历方式2 —— 下标遍历
    void traverseVector_1(vector<int> v)
    {
      for(unsigned int i = 0; i < v.size(); ++i)
      {
          cout<<v[i]<<" ";
      }
      cout<<endl;
    }

二、map常用操作

1、常用操作

begin() 返回指向map头部的迭代器

 clear()        删除所有元素

 count()         返回指定元素出现的次数

 empty()         如果map为空则返回true

 end()           返回指向map末尾的迭代器

 erase()         删除一个元素

 find()          查找一个元素

 insert()        插入元素

 key_comp()      返回比较元素key的函数

 lower_bound()   返回键值>=给定元素的第一个位置

 max_size()      返回可以容纳的最大元素个数

 rbegin()        返回一个指向map尾部的逆向迭代器

 rend()          返回一个指向map头部的逆向迭代器

 size()          返回map中元素的个数

2、1 插入

// 定义一个map对象
map<int, string> mapStudent;

// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));

// 第二种 用insert函数插入value_type数据
mapStudent.insert(map<int, string>::value_type(001, "student_one"));

// 第三种 用"array"方式插入
mapStudent[123] = "student_first";
mapStudent[456] = "student_second";

2.2、 取值

Map中元素取值主要有at和[ ]两种操作,at会作下标检查,而[]不会。

map<int, string> ID_Name;

//ID_Name中没有关键字2016,使用[]取值会导致插入
//因此,下面语句不会报错,但打印结果为空
cout<<ID_Name[2016].c_str()<<endl;

//使用at会进行关键字检查,因此下面语句会报错
ID_Name.at(2016) = "Bob";

2.3、查找

当所查找的关键key出现时,它返回数据所在对象的位置,如果沒有,返回iter与end函数的值相同。

// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
iter = mapStudent.find("123");

if(iter != mapStudent.end())
       cout<<"Find, the value is"<<iter->second<<endl;
else
   cout<<"Do not Find"<<endl;

2.4、刪除与清空元素

//迭代器刪除
iter = mapStudent.find("123");
mapStudent.erase(iter);

//用关键字刪除
int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0

//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//等同于mapStudent.clear()

2.5、map容器的迭代器first、second用法

c++ 里面的map容器的迭代器first、second用法
例:
map<string, int> m_stlmap;
m_stlmap[“xiaomi”] = 88;

auto mpit = m_stlmap.begin();
first会得到Map中key的有效值,
second会得到Map中value的有效值。

所以
mpit ->first; // 得到是 string 值是 “xiaomi”
mpit ->second; //得到是 int 值是 88

  • 注意
    pair<int, int>中
    用.frist 和 .second

2.6、遍历

map<string,int> m;

map<string,int>::iterator it;

it = m.begin();

while(it != m.end())
{
it->first;
it->second;
it ++;
}

3、vector和map混合使用

  • it->second[i];
int main()
{
    map<int, int> store;
    map<int, vector<int>> data;

    store.insert(pair<int, int>(1, 100));
    store.insert(pair<int, int>(2, 200));
    store.insert(pair<int, int>(3, 300));

    data.insert(pair<int, vector<int>>(1, { 10, 100, 1000 }));
    data.insert(pair<int, vector<int>>(2, { 20, 200, 2000 }));

    map<int, int>::iterator it = store.begin();

    /*
    for (int i = 0; i < data[1].size(); i++)
    {
        cout << data[1][i] << endl;
    }
        */
    if (data.find(1) != data.end())
    {
        map<int, vector<int>>::iterator it = data.find(1);
        for (int i = 0; i < it->second.size(); i++)
        {
            cout << it->second[i] << endl;
        }

    }

三、其他一些函数

1、rand()函数

  • C++中rand() 函数的用法
    1、rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。
    2、如果你要产生0-99这100个整数中的一个随机整数,可以表达为:int num = rand() % 100;
    这样,num的值就是一个0-99中的一个随机数了。
    3、如果要产生1-100,则是这样:int num = rand() % 100 + 1;
    4、总结来说,可以表示为:int num = rand() % n +a;
    其中的a是起始值,n-1+a是终止值,n是整数的范围。
    5、一般性:rand() % (b-a+1)+ a ; 就表示 a~b 之间的一个随机整数。

  • 格式
    rand(产生随机数)
    表头文件: #include<stdlib.h>
    定义函数 :int rand(void)

四、一些其他数据结构

1、priority_queue(优先队列)

  • 对于这个模板类priority_queue,它是STL所提供的一个非常有效的容器。
    作为队列的一个延伸,优先队列包含在头文件 <queue> 中。</queue>

  • 成员函数
    假设type类型为int,则:

    • bool empty() const
      返回值为true,说明队列为空;
    • int size() const
      返回优先队列中元素的数量;
    • void pop()
      删除队列顶部的元素,也即根节点
    • int top()
      返回队列中的顶部元素,但不删除该元素;
    • void push(int arg)
      将元素arg插入到队列之中;

五、queue

1、常用操作

  • queue 操作
    queue 和 stack 有一些成员函数相似,但在一些情况下,工作方式有些不同:
  • front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
  • back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
  • push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 - push_back() 来完成的。
  • push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
  • pop():删除 queue 中的第一个元素。
  • size():返回 queue 中元素的个数。
  • empty():如果 queue 中没有元素的话,返回 true。
  • emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
  • swap(queue<t> &other_q):将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。</t>