目錄
- 1、傳引用
- 2、vector使用
- 初始化方法
- 常用成員函數
- 3、字符串string
- 初始化方法
- 常用成員函數
- 4、哈希表 unordered_map
- 初始化
- 常用成員函數
- 示例:計數器
- 5、哈希集合 unordered_set
- 初始化
- 常用成員函數
- 6、隊列 queue
- 初始化
- 成員函數
- 7、棧stack
- 初始化
- 常用成員函數
- 7、emplace_back 與 push_back的區別
- 8、vector 中“=”是深復制,拷貝構造也是深復制
- 8、vector swap()、assign()用法
1、傳引用
C++函數參數默認是傳值的,如果使用數組之類的容器作為參數,一般會加上&符號表示傳引用。
沒有加&,就是傳值,會涉及到數據復制。在遞歸函數中,每次遞歸都會復制一遍容器,非常耗時
2、vector使用
初始化方法
//初始化一個int型的空數組nums
vector<int> nums;//初始化一個大小為n的數組nums,數組中的值默認為0
vector<int> nums(n);//初始化一個元素為1、2、3的數組nums
vector<int> nums{1,3,5};
//初始化一個大小為n的數組nums,其值全都為2
vector<int> nums(n,2);//初始化一個二維int數組dp
vector<vector<int>> dp;//初始化一個大小為m * n的布爾數組dp
//值均為true
vector<vector<bool>> dp(m,vector<bool>(n,true));
常用成員函數
//返回數組是否為空
bool vector.empty()//返回元素個數
size_type vector.size()//返回數組中最后一個元素的引用
reference vector.back()//在數組尾部插入一個元素val
void vector.push_back(val);//刪除數組尾部元素
void pop_back();
3、字符串string
初始化方法
//s是一個空字符串
string s;
//s是字符串"abc"
stirng s = "abc";
常用成員函數
//返回字符串長度
size_t s.size()//判斷字符串是否為空
bool s.empty()//在字符串尾部插入一個字符
void s.push_back(char c);//刪除字符串尾部字符
void pop_back()//返回從索引pos開始,長度為len的子字符串
string substr(size_t pos, size_t len)//判斷兩個字符串是否相等
bool s1 == s2
4、哈希表 unordered_map
初始化
//初始化一個key為int,value為int的哈希表
unordered_map<int,int> hash_map;//初始化一個key為string,value為int數組的哈希表
unordered_map<string,vector<int>> hash_map;
常用成員函數
//返回哈希表鍵值對個數
size_type hash_map.size();//返回哈希表是否為空
bool hash_map.empty();//返回哈希表中key出現的次數
//因為哈希表不會出現重復的鍵,所以該函數只可能返回0或1
//可以用來判斷key是否存在與哈希表中
size_type hash_map.count(key);//通過key清除哈希表中的鍵值對
size_type hash_map.erase(key);
需要注意的點:對于unordered_map,使用方括號[]訪問鍵key時,如果key不存在,則會自動創建key,對應的值為默認值。
示例:計數器
vector<int> nums{1,1,3,4,5,3,6};unordered_map<int,int> counter;
for(int num : nums)
{//可以通過[]直接訪問或修改對應的鍵counter[num]++;
}
//遍歷哈希表中的鍵值對
for(auto& it : counter)
{int key = it.first;int val = it.second;cout << key << ": " << val << endl;
}
上面的counter[num]++;
實際對應了下面語句:
for(int num : nums)
{if(!counter.count(num)) counter[num] = 0;counter[num]++;
}
5、哈希集合 unordered_set
初始化
//初始化一個存儲int的哈希集合
unordered_set<int> visited;//初始化一個存儲string的哈希集合
unordered_set<string> visited;
常用成員函數
//返回哈希表的鍵值對個數
size_type unordered_set.size();//返回哈希表是否為空
bool unordered_set.empty();//類似哈希表,如果key存在則返回1,否則返回0
size_type unordered_set.count(key);//向集合中插入一個元素key
pair<iterator,bool> unordered_set.insert(key);//刪除哈希集合中的元素key
//如果刪除成功返回1,如果key不存在返回0
size_type unordered_set.erase(key);
6、隊列 queue
初始化
//初始化一個存儲int的隊列
queue<int> q;//初始化一個存儲string的隊列
queue<string> q;
成員函數
//返回隊列是否為空
bool q.empty();//返回隊列中元素個數
size_type q.size();//將元素加入隊尾
void q.push(val);//返回隊頭元素的引用
value_type& front();//刪除隊頭元素
void pop();
需要注意的是,隊列pop方法一般是void類型的,不會同時返回被刪除的元素,所以,如果想用被刪除的元素,得先取出來;
int e = q.front();
q.pop();
7、棧stack
初始化
//初始化一個存儲int的堆棧
stack<int> stk;//初始化一個存儲string的堆棧
stack<string> stk;
常用成員函數
//返回堆棧是否為空
bool stk.empty();//返回堆棧中元素的個數
size_type stk.size();//在棧頂添加元素
void stk.push(val);//返回棧頂元素的引用
value_type& stk.top();//刪除棧頂元素
void stk.pop();
7、emplace_back 與 push_back的區別
摘自https://www.jianshu.com/p/adf58f9fad84
emplace_back和push_back都有往容器后面插入一個元素的作用
不同的是
emplace_back() 和 push_back() 的區別,就在于底層實現的機制不同。push_back() 向容器尾部添加元素時,首先會創建這個元素,然后再將這個元素拷貝或者移動到容器中(如果是拷貝的話,事后會自行銷毀先前創建的這個元素);而 emplace_back() 在實現時,則是直接在容器尾部創建這個元素,省去了拷貝或移動元素的過程
8、vector 中“=”是深復制,拷貝構造也是深復制
兩個vector的地址并不相同:
int main()
{int w = 100;int h = 20;vector<int> dataA(w * h, 0Xff);vector<int> dataB = dataA; // copy 構造int* ptr0 = &dataA[0];int* ptr1 = &dataB[0];cout << ptr0 << endl;cout << ptr1 << endl;return 0;
}
8、vector swap()、assign()用法
利用swap()函數(交換兩個vector)
vector<int> array{3, 5, 2, 6, 4};
vector<int> outArray{ 1,2,3 };
outArray.swap(array);//outArray={3,5,2,6,4};array={1,2,3}
利用assign()函數(清空并深復制)
vector<int> array{3, 5, 2, 6, 4};
vector<int> outArray{ 1,2,3 };
outArray.assign(array.begin(),array.end());//清空原數據,賦予新數據={3,5,2,6,4}
outArray.assign(5, 0);//5個0,清空原數據={0,0,0,0,0,}