STL 中set 以及 vector基本操作


set中每個元素最多隻出現一次,並且set中的元素已經從小到大排好序。

set 基本操作:

  1. begin()    返回set容器的第一個元素的地址
  2. end()      返回set容器的最後一個元素地址
  3. clear()    刪除set容器中的所有的元素
  4. empty()     判斷set容器是否爲空
  5. max_size()   返回set容器可能包含的元素最大個數
  6. size()      返回當前set容器中的元素個數
  7. erase(it) 刪除迭代器指針it處元素
  8. insert() 在set中插入元素(set中不存在)set中存在則插入無效
  9. count() :用來查找set中某個元素出現的次數。這個函數在set並不是很實用,因爲一個鍵值在set只可能出現0或1次,這樣就變成了判斷某一鍵值是否在set出現過了。
  10. find(): 用來查找set中某個元素出現的位置。如果找到,就返回這個元素的迭代器,如果這個元素不存在,則返回 s.end() (最後一個元素的位置,s爲set的變量名)
#include <iostream>
#include <set>
using namespace std;
#include<string>
struct Info
{
    string name;
    double score;
    bool operator < (const Info &a) const // 重載“<”操作符,自定義排序規則
    {
        //按score由大到小排序。如果要由小到大排序,使用“>”即可。
        return a.score > score;
    }
};

int main()
{
    set<int> s;
    set<int>::iterator it1;        //此處set的迭代器類似於 指針變量
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.insert(1);
    cout<<"set 的 size 值爲 :"<<s.size()<<endl;  // --> 3
    cout<<"set 的 maxsize的值爲 :"<<s.max_size()<<endl; // --> 461168601842738790
    cout<<"set 中的第一個元素是 :"<<*s.begin()<<endl; // --> 1
    cout<<"set 中的最後一個元素是:"<<*s.end()<<endl; // --> 3
    for(set<int>::iterator it = s.begin(); it != s.end(); ++it) //遍歷 set
    {
    	cout<< *it << endl;
    }
    s.clear();  // 清除set ,此時 s.empty() 爲真
    if(s.empty())
    {
        cout<<"set 爲空 !!!"<<endl;
    }
    cout<<"set 的 size 值爲 :"<<s.size()<<endl;
    cout<<"set 的 maxsize的值爲 :"<<s.max_size()<<endl; // 461168601842738790
    it1 = s.find(4);            //查找數據
    //如果沒找到就輸出set最後一個元素,找到就輸出該元素
    cout <<  *it1 << endl;  // --> s.end()  3


    // s.clear();
    //在聲明set<int> s 之後不能夠重複聲明 set<Info> s 即便在之前使用s.clear()也不行
    set<Info> sinfo;
    Info info;

    //插入三個元素
    info.name = "Jack";
    info.score = 80;
    sinfo.insert(info);
    info.name = "Tom";
    info.score = 99;
    sinfo.insert(info);
    info.name = "Steaven";
    info.score = 60;
    sinfo.insert(info);

    set<Info>::iterator it;
    for(it = sinfo.begin(); it != sinfo.end(); it++)
        cout << (*it).name << " : " << (*it).score << endl; 
    // Steaven : 60
    // Jack: 80
    // Tom: 99
    return 0;
}

vector中的內存爲自動分配,依據需求分配

vector 基本操作:

  1. push_back() 在數組的最後添加一個數據
  2. pop_back() 去掉數組的最後一個數據
  3. at() 得到編號位置的數據
  4. begin() 返回一個迭代器,它指向容器vector的第一個元素
  5. end() 返回一個迭代器,它指向容器c的最後一個元素的下一個位置
  6. front() 得到數組頭的引用
  7. back() 得到數組的最後一個單元的引用
  8. max_size() 得到vector最大可以是多大
  9. capacity() 當前vector分配的大小
  10. size() 當前使用數據的大小
  11. resize() 改變當前使用數據的大小,如果它比當前使用的大,者填充默認值
  12. reserve() 改變當前vecotr所分配空間的大小
  13. erase() 刪除指針指向的數據項
  14. clear() 清空當前的vector
  15. rbegin() 返回一個逆序迭代器,它指向容器c的最後一個元素
  16. rend() 返回一個逆序迭代器,它指向容器c的第一個元素前面的位置
  17. empty() 判斷vector是否爲空
  18. swap() 與另一個vector交換數據

vector 中的pop_back 是去掉最後一個元素, queue 中的pop 去除首元素

代碼演示 push_back、pop_back、end、begin、size、capacity

#include <iostream>
#include <vector>
using namespace std;
#include<string>


int main()
{
  vector<int> v;
  //vector<int> v={0,1,2,3}; //等同於for循環的push_back初始化,不過{}賦初值爲c++11新特性
  int len = 4;
  for(int i=0; i<len; i++)
  {
    v.push_back(i);
    // v[i] = i; //不可以這種方式對vector進行初始化
  }
  for(vector<int>::iterator it=v.begin(); it!=v.end(); it++)
  {
      cout<< *it << " ";
  }
  cout<< endl;
  cout<<"v.capacity() : " << v.capacity() <<endl; // --> 4
  //v.end()返回vector 最後一個元素後的指針
  cout<<"v.end() : " << *v.end() << endl; // --> 0
  v.pop_back();
  cout<<"v.capacity() : " << v.capacity() <<endl; // --> 4
  cout<<"v.end() : " << *v.end() << endl; // --> 3
  cout<<"v.size() : " << v.size() <<endl; // --> 3
  for(int i = 0; i<v.size(); i++)
  {
      cout<< v[i] <<" ";
  }
  // --> 0 1 2
  cout<<endl;
  cout<<"v.begin(): "<< *v.begin() <<endl; // --> 0
  //如果聲明一個 iterator 接受 v.rbegin()則會出錯;因爲v.rbegin()返回的是一個逆向迭代器
  for(vector<int>::reverse_iterator it=v.rbegin(); it!=v.rend(); it++)
  {
      //逆向遍歷 vector
      cout<< *it << " ";
  }
  cout<<endl;
    for(vector<int>::reverse_iterator it=v.rend()-1; it!=v.rbegin()-1; --it)
  {
      //使用反向迭代器正向遍歷 vector
      cout<< *it << " ";
  }
  cout<<endl;
  v.back() = 22;
  cout<<v.back()<<endl; //最後一個元素的引用
}

排序vector時,從大到小,從小到大的排序

//從大到小
	sort(vec.begin(), vec.end());
// sorts in reverse: puts smallest element at the end of vec
	sort(vec.rbegin(), vec.rend());

圖文示例 begin()、end()、rbegin()、rend()

反向迭代器圖示:

流迭代器不能使用反向迭代器
使用迭代器找到第一個單詞:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    string line = {"FIRST,MIDDLE,LAST"};
    string::iterator comma = find(line.begin(), line.end(), ',');
	cout << string(line.begin(), comma) << endl; // --> FIRST
    return 0;
}

但是想用 定位最後一個單詞,使用下邊代碼則出錯

// find last element in a comma-separated list
      string::reverse_iterator rcomma = find(line.rbegin(), line.rend(), ',');
// wrong: will generate the word in reverse order
      cout << string(line.rbegin(), rcomma) << endl;
// 此時出錯,因爲流迭代器不能使用反向迭代器

應該使用

	string::reverse_iterator rcomma = find(line.rbegin(), line.rend(), ',');
    cout << string(rcomma.base(), line.end()) << endl; // --> LAST

在這裏插入圖片描述

代碼示例 remove 和 erase

erase()返回的迭代器指向刪除元素的下一個元素所在地址
erase有兩種用法:

  1. erase( iterator _Where); 刪除迭代器所指的元素
  2. erase( iterator _First, iterator _Last); 刪除兩個迭代器中間的元素(下例使用)
#include <iostream>
#include <memory>
#include <vector>
#include <algorithm> // 包含remove

using namespace std;

int main()
{
    vector<int> c = {1,2,3,4,5,1,7,8,9,10,12}; //c++11使用{}賦初值的新特性
    cout << "size : " << c.size() << endl;

    vector<int>::iterator it = remove(c.begin(), c.end(), 1);
    //stl中的remove僅僅是將需要刪除的數移除,後邊的數挨個向前移,然後vector長度不變
    //返回的迭代器指向需要刪除的元素的地址
    cout << "size : " << c.size() << endl;
    for(vector<int>::iterator itv = c.begin(); itv!=c.end(); itv++)
    {
        cout<< *itv << " ";
    }
    cout<<endl;
    // 輸出 2 3 4 5 7 8 9 10 12 10 12
    // 迭代器指向的是第二個10 所在的地址

    c.erase(it,c.end());
    for(vector<int>::iterator itv = c.begin(); itv!=c.end(); itv++)
    {
        cout<< *itv << " ";
    }
    cout<< endl;
    // 輸出 2 3 4 5 7 8 9 10 12
    
}

參考鏈接:
set用法:https://www.cnblogs.com/yaoyueduzhen/p/4536929.html
反向迭代器:https://blog.csdn.net/kjing/article/details/6936325#
vector中的erase:https://www.cnblogs.com/zsq1993/p/5930229.html
c++11大括號初始化新特性:http://www.cnblogs.com/xiaozz/p/6448247.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章