C++ sort + vector 應用:求取陣列中第K大的數( LeetCode 215. Kth Largest Element in an Array )
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
Example 1:
Input: [3,2,1,5,6,4]
and k = 2
Output: 5
Example 2:
Input: [3,2,3,1,2,4,5,5,6]
and k = 4
Output: 4
Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.
以下演算法相應的程式碼
class Solution {public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(),nums.end()); //從小到大 ,呼叫C++函式
return nums[nums.size()-k];
}
};
C++ vector 容器淺析
一、什麼是vector?
向量(Vector)是一個封裝了動態大小陣列的順序容器(Sequence Container)。跟任意其它型別容器一樣,它能夠存放各種型別的物件。可以簡單的認為,向量是一個能夠存放任意型別的動態陣列。
二、容器特性
1.順序序列
順序容器中的元素按照嚴格的線性順序排序。可以通過元素在序列中的位置訪問對應的元素。
2.動態陣列
支援對序列中的任意元素進行快速直接訪問,甚至可以通過指標算述進行該操作。操供了在序列末尾相對快速地新增/刪除元素的操作。
3.能夠感知記憶體分配器的(Allocator-aware)
容器使用一個記憶體分配器物件來動態地處理它的儲存需求。
三、基本函式實現
1.建構函式- vector():建立一個空vector
- vector(int nSize):建立一個vector,元素個數為nSize
- vector(int nSize, const T& t):建立一個vector,元素個數為nSize,且值均為t
- vector(const vector&):複製建構函式
- vector(begin,end):複製[begin,end)區間內另一個數組的元素到vector中
2.增加函式
- void push_back(const T& x):向量尾部增加一個元素X
- iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一個元素x
- iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n個相同的元素x
- iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一個相同型別向量的[first,last)間的資料
3.刪除函式
- iterator erase(iterator it):刪除向量中迭代器指向元素
- iterator erase(iterator first,iterator last):刪除向量中[first,last)中元素
- void pop_back():刪除向量中最後一個元素
- void clear():清空向量中所有元素
4.遍歷函式
- reference at(int pos):返回pos位置元素的引用
- reference front():返回首元素的引用
- reference back():返回尾元素的引用
- iterator begin():返回向量頭指標,指向第一個元素
- iterator end():返回向量尾指標,指向向量最後一個元素的下一個位置
- reverse_iterator rbegin():反向迭代器,指向最後一個元素
- reverse_iterator rend():反向迭代器,指向第一個元素之前的位置
5.判斷函式
- bool empty() const:判斷向量是否為空,若為空,則向量中無元素
6.大小函式
- int size() const:返回向量中元素的個數
- int capacity() const:返回當前向量張紅所能容納的最大元素值
- int max_size() const:返回最大可允許的vector元素數量值
7.其他函式
- void swap(vector&):交換兩個同類型向量的資料
- void assign(int n,const T& x):設定向量中第n個元素的值為x
- void assign(const_iterator first,const_iterator last):向量中[first,last)中元素設定成當前向量元素
8.看著清楚
1.push_back 在陣列的最後新增一個數據
2.pop_back 去掉陣列的最後一個數據
3.at 得到編號位置的資料
4.begin 得到陣列頭的指標
5.end 得到陣列的最後一個單元+1的指標
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 將vector反轉後的開始指標返回(其實就是原來的end-1)
16.rend 將vector反轉構的結束指標返回(其實就是原來的begin-1)
17.empty 判斷vector是否為空
18.swap 與另一個vector交換資料
四、基本用法
#include < vector> using namespace std;
五、簡單介紹
- Vector<型別>識別符號
- Vector<型別>識別符號(最大容量)
- Vector<型別>識別符號(最大容量,初始所有值)
- Int i[5]={1,2,3,4,5}
Vector<型別>vi(I,i+2);//得到i索引值為3以後的值 - Vector< vector< int> >v; 二維向量//這裡最外的<>要有空格。否則在比較舊的編譯器下無法通過
例項
0.萬能標頭檔案 #include<bits/stdc++.h>
等價於
#include "stdafx.h"#include<vector>
#include<string.h>
#include<iostream>
using namespace std;
// C
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#if __cplusplus >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdalign>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#endif
// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif
1.pop_back()&push_back(elem)例項在容器最後移除和插入資料
例項
int main() {vector<int>obj;
for (int i = 0;i < 10;i++) {
obj.push_back(i);
cout << obj[i] << ",";
}
for (int i = 0;i < 5;i++) {
obj.pop_back();
}
cout << "\n" << endl;
for (int i = 0;i < obj.size();i++){
cout << obj[i] << ",";
}
cout << "\n" << endl;
system("pause");
return 0;
}
輸出結果為:
0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,
2.clear()清除容器中所以資料
例項
int main(){
vector <int>obj;
for (int i = 0;i < 10;i++) {
obj.push_back(i);
cout << obj[i] << ",";
}
obj.clear();
for (int i = 0;i < obj.size();i++) {
cout << obj[i] << endl;
}
system("pause");
return 0;
}
輸出結果為:
0,1,2,3,4,5,6,7,8,9,
3.排序
例項
int main(){
vector <int>obj;
obj.push_back(1);
obj.push_back(3);
obj.push_back(0);
sort(obj.begin(), obj.end());
cout << "從小到大:" << endl;
for (int i = 0;i < obj.size();i++) {
cout << obj[i] << ",";
}
cout << "\n" << endl;
cout << "從大到小:" << endl;
reverse(obj.begin(), obj.end());
for (int i = 0;i < obj.size();i++) {
cout << obj[i] << ",";
}
cout << "\n" << endl;
system("pause");
return 0;
}
輸出結果為:
從小到大: 0,1,3, 從大到小: 3,1,0,
1.注意 sort 需要標頭檔案 #include <algorithm>
2.如果想 sort 來降序,可重寫 sort
bool compare(int a,int b) { return a< b; //升序排列,如果改為return a>b,則為降序 } int a[20]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<20;i++) cout<< a[i]<< endl; sort(a,a+20,compare);
4.訪問(直接陣列訪問&迭代器訪問)
例項
int main(){
vector <int>obj;
for (int i = 0;i < 10;i++)
{
obj.push_back( i );
}
cout << "直接利用陣列:";
for (int i = 0;i<10;i++)//方法一
{
cout << obj[i] << " ";
}
cout << endl;
cout << "利用迭代器:";
//方法二,使用迭代器將容器中資料輸出
vector<int>::iterator it;//宣告一個迭代器,來訪問vector容器,作用:遍歷或者指向vector容器的元素
for (it = obj.begin();it != obj.end();it++)
{
cout << *it << " ";
}
system("pause");
return 0;
}
輸出結果為:
直接利用陣列:0 1 2 3 4 5 6 7 8 9 利用迭代器:0 1 2 3 4 5 6 7 8 9
5.二維陣列兩種定義方法(結果一樣)
方法一
int main() {int N = 5, M = 6;
vector<vector<int> > obj(N); //定義二維動態陣列大小5行
for (int i = 0; i< obj.size(); i++)//動態二維陣列為5行6列,值全為0
{
obj[i].resize(M);
}
for (int i = 0; i< obj.size(); i++)//輸出二維動態陣列
{
for (int j = 0;j<obj[i].size();j++) {
cout << obj[i][j] << " ";
}
cout << "\n";
}
system("pause");
return 0;
}
方法二
int main() {
int N = 5, M = 6;
vector<vector<int> > obj(N, vector<int>(M)); //定義二維動態陣列5行6列
for (int i = 0; i< obj.size(); i++)//輸出二維動態陣列
{
for (int j = 0;j<obj[i].size();j++)
{
cout << obj[i][j] << " ";
}
cout << "\n";
}
return 0;
}
輸出結果為:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
原文地址:http://www.runoob.com/w3cnote/cpp-vector-container-analysis.html