1. 程式人生 > >C++11 STL容器新用法

C++11 STL容器新用法

一、常用

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));