C++11 STL容器新用法
阿新 • • 發佈:2019-02-14
一、常用
1、using用法
using Vector = Eigen::Matrix<FloatType, 3, 1>;
// 類型別名,等同於
typedef Eigen::Matrix<FloatType, 3, 1> Vector;
2、std::move() 使用
通過std::move,可以避免不必要的拷貝操作。
std::move是為效能而生。
std::move是將物件的狀態或者所有權從一個物件轉移到另一個物件,只是轉移,沒有記憶體的搬遷或者記憶體拷貝。
#include <iostream> #include <utility> #include <vector> #include <string> int main() { std::string str = "Hello"; std::vector<std::string> v; // uses the push_back(const T&) overload, which means // we'll incur the cost of copying str v.push_back(str); std::cout << "After copy, str is \"" << str << "\"\n"; // uses the rvalue reference push_back(T&&) overload, // which means no strings will be copied; instead, the contents // of str will be moved into the vector. This is less // expensive, but also means str might now be empty. v.push_back(std::move(str)); std::cout << "After move, str is \"" << str << "\"\n"; std::cout << "The contents of the vector are \"" << v[0] << "\", \"" << v[1] << "\"\n"; }
輸出:
After copy, str is "Hello"
After move, str is ""
The contents of the vector are "Hello", "Hello"
3、unordered_map,unordered_set,map和set的用法和區別
unordered_map和map
unordered_map儲存機制是雜湊表,即unordered_map內部元素是無序的。
map是紅黑樹,map中的元素是按照二叉搜尋樹儲存,進行中序遍歷會得到有序遍歷。
unordered_map的初始化比較耗時,我們都知道map是紅黑樹,unordered_map是雜湊表,造成效能差異的原因在於,紅黑樹初始化時,節點只需要一個,後續的插入只是插入新的節點,但是雜湊表初始化時就不是那麼簡單了,雜湊表初始化時需要申請一個數組,陣列的每個元素都指向一條連結串列,所以初始化時需要申請很多記憶體,相比於map,的確更耗時。
unordered_set和set
unordered_set基於雜湊表,是無序的。
set實現了紅黑樹的平衡二叉檢索樹的資料結構,插入元素時,它會自動調整二叉樹的排列,把元素放到適當的位置,以保證每個子樹根節點鍵值大於左子樹所有節點的鍵值,小於右子樹所有節點的鍵值;另外,還得保證根節點左子樹的高度與右子樹高度相等。
平衡二叉檢索樹使用中序遍歷演算法,檢索效率高於vector、deque和list等容器,另外使用中序遍歷可將鍵值按照從小到大遍歷出來。
二、map
1、std::map::at
//Map中元素取值主要有at和[]兩種操作,at會作下標檢查,而[]不會。 std::cout<< _map.at(100).c_str()<< std::endl;//使用at會進行關鍵字檢查,因為沒有100因此該語句會報錯 std::cout << _map.at(4).c_str() << std::endl;//因為已經有4了,不會報錯 std::cout << _map[300].c_str() << std::endl;//ID_Name中沒有關鍵字200,使用[]取值會導致插入,因此不會報錯,但列印結果為空
// map::at
#include <iostream>
#include <string>
#include <map>
int main ()
{
std::map<std::string,int> mymap = {
{ "alpha", 0 },
{ "beta", 0 },
{ "gamma", 0 } };
mymap.at("alpha") = 10;
mymap.at("beta") = 20;
mymap.at("gamma") = 30;
for (auto& x: mymap) {
std::cout << x.first << ": " << x.second << '\n';
}
return 0;
}
輸出:
alpha: 10
beta: 20
gamma: 30
三、queue
1、std::deque::pop_front
刪除deque容器中的第一個元素
// deque::pop_front
#include <iostream>
#include <deque>
int main ()
{
std::deque<int> mydeque;
mydeque.push_back (100);
mydeque.push_back (200);
mydeque.push_back (300);
std::cout << "Popping out the elements in mydeque:";
while (!mydeque.empty())
{
std::cout << ' ' << mydeque.front();
mydeque.pop_front();
}
std::cout << "\nThe final size of mydeque is " << int(mydeque.size()) << '\n';
return 0;
}
輸出:
Popping out the elements in mydeque: 100 200 300
The final size of mydeque is 0
2、std::queue::front
返回位於佇列開頭的第一個元素的引用。
// queue::front
#include <iostream> // std::cout
#include <queue> // std::queue
int main ()
{
std::queue<int> myqueue;
myqueue.push(77);
myqueue.push(16);
myqueue.front() -= myqueue.back(); // 77-16=61
std::cout << "myqueue.front() is now " << myqueue.front() << '\n';
return 0;
}
輸出:
myqueue.front() is now 61
3、std::queue::back
返回佇列最後一個元素的引用。
// queue::back
#include <iostream> // std::cout
#include <queue> // std::queue
int main ()
{
std::queue<int> myqueue;
myqueue.push(12);
myqueue.push(75); // this is now the back
myqueue.back() -= myqueue.front();
std::cout << "myqueue.back() is now " << myqueue.back() << '\n';
return 0;
}
輸出:
myqueue.back() is now 63
四、vector
1、初始化二維vector
初始化二維vector,為r*c的vector,所有值為0.
vector<vector<int> > newOne(r, vector<int>(c, 0));