1. 程式人生 > >C++實現算法常用的STL---整理

C++實現算法常用的STL---整理

快排 reat spa 快速 The 第一個元素 c++ 也會 else

algorithm

  sort快排

#include<algorithm>   //註意包含algorithm頭文件
#include<iostream>
using namespace std;
int main()
{
    int arr[] = {1,9,8,4,3,6,0,11};
    int length = sizeof(arr) / 4;

    //快速排序
    //sort的排序範圍是[start, end),默認使用從小到大排序。
    sort(arr, arr + 3);   //只排序前3個
    sort(arr + 2, arr + length); //排序第2個元素之後的元素。
    sort(arr, arr + length); //排序整個數組
    sort(arr, arr + length, greater<int>()); //從大到小排序整個數組
    return 0;
}

  

  binary_search二分查找

int arr[] = {0,3,5,7,10,15,19,20,22,24,27};
int length = sizeof(arr) / 4;
bool isFind = true;

isFind = binary_search(arr + 2, arr + length, 19); //在[start, end)中進行二分查找key
cout<< isFind << endl;

stack

#include<stack>   //註意包含stack頭文件
#include<iostream>
using namespace std;
int main()
{
    stack<int> s; //聲明stack中的類型,以及棧名稱
    s.push(3);
    s.push(4);    //入棧
    int length = s.size(); //獲取棧元素數量
    int top = s.top();    //獲取棧頂元素(不出棧)
    s.pop();    //出棧
    bool isEmpty = s.empty();
    return 0;
}

 

queue

#include<iostream>
#include<queue>   //註意包含queue頭文件
using namespace std;
int main()
{
    queue<string> q;
    string s;
    q.push("hello");  //入隊
    q.push("world");

    cout<< q.front() << endl;   //hello 獲取隊首元素值,但是不出隊
    cout<< q.back() << endl;    //world 獲取隊尾元素值,但是不出隊

    q.pop();   //隊首元素出隊
    cout<< q.front() << endl;   //world
    cout<< "size " << q.size() << endl;
    cout<< "isEmpty " << q.empty() <<endl;
    return 0;
}

  

set/multiset

  multiset/set使用平衡二叉樹的數據結構,插入和查找時間復雜度都是log n。

  multiset和set的用法相同,只有一個區別:

    1、multiset中可以出現重復的元素。

    2、set中不會出現重復的元素,即使添加重復的元素,也會自動去重。

#include<iostream>
#include<set>   //multiset和set都要包含set頭文件
using namespace std;
int main()
{
    int arr[10] = {5,1,2,4,6,4,3,5,8,8};//有重復的元素
    int i;
    multiset<int> ms; //創建一個空格multiset集合
    for (i = 0; i < 10; i++) {
        ms.insert(arr[i]);
    }

    multiset<int>::iterator p;  //聲明一個叠代器,類似於指針
    for (p = ms.begin(); p != ms.end(); p++) {
        //ms.begin()  返回一個叠代器,指向multiset的第一個元素
        //ms.end()   返回一個叠代器,指向multiset最後一個元素的後面一個位置
        cout << *p << " ";    //1 2 3 4 4 5 5 6 8 8
    }
    cout << endl;
    int length = ms.size();   //集合中元素的數量
    bool isEmpty = ms.empty();  // 集合是否為空
    int cnt = ms.count(8);   //計算一個數出現的次數
    cout<< length << " " << isEmpty << " " << cnt << endl;  // 10  0   2

    //查找元素,如果找到的話,返回一個叠代器指向找到的元素。如果沒有找到的話,就返回multiset中元素總個數size
    p = ms.find(8);
    if (*p != ms.size()) {
        cout<< "found " << *p << endl;   //8
        ms.erase(*p);   //刪除集合中所有的8,不是只刪除一個。
        cout<< "after delete , the size is "<< ms.size() << endl;
    } else {
        cout<<"not found"<<endl;
    }
    return 0;
}

  

map/multimap

  map和multimap的都是使用hash算法。

  區別在於,map中的key只能出現一次,而multimap可以出現很多次。

#include<iostream>
#include<map>   //multimap和map都要包含set頭文件
using namespace std;
int main()
{
    map<string, string> m;
    m["one"] = "hello";
    m["two"] = "world";
    m.insert(pair<string, string>("three", "C++"));

    bool isEmpty = m.empty();
    int length = m.size();
    string s = m["one"];  //找到的話,就返回對應的值
    cout<< s <<endl;   // hello
    s = m["four"];    //未找到的話,就返回一個類型零值
    cout<< s <<endl;  //返回空字符串

    map<string, string>::iterator p;
    p = m.find("one");
    cout<< p->second << endl; //輸出one對應的值--> hello

    m.erase(p);  //刪除某個key
    for (p = m.begin(); p != m.end(); p++) {
        cout<< p->second << " ";  // C++ world
    }

    m.clear(); //清空map
    return 0;
}

  

C++實現算法常用的STL---整理