C++ 工具庫 線程庫 容器庫 時間庫

C++工具庫

類型支持

  • std::size_t
  • std::nullptr_t      字面量nullptr的類型
  • std::type_info    類型信息typeid(int)
  • std::is_integral  
  • std::rank            數組維度

動態內存管理

指針類別

unique_ptr

// 初始化
unique_ptr<int> p(new int(2));
unique_ptr<int> p = std::move(p);

// 修改器
release
reset
swap

// 其他
get
get_deleter
operator*
operator->
operator bool

shared_ptr (初始化、修改器、刪除器 + 智能指針)

// 將普通指針複製給共享對象智能指針編譯會出錯
// nullptr可以直接複製,所以不要將普通指針直接複製給共享對象智能指針
// 初始化兩種方式
std::shared_ptr<int> p(new int(2));
std::shared_ptr<int> p = make_shared<int>(2);

// 修改管理指針
reset
swap

// 最常用
get
use_count
operator*
operator->
operator bool

// 指定刪除器
std::shared_ptr<int> p(new int,     [](int* p){delete p;});
std::shared_ptr<int> p(new int[10], [](int* p){delete []p;});
std::shared_ptr<int> p(new int[10], std::default_delete<int[]>);

// 注意點
// 1. 不要用原始指針初始化多個shared_ptr
// 2. 不要在函數實參中創建shared_ptr
// 3. 不要直接返回shared_ptr<T>(this),而是繼承enable_shared_from_this,返回shared_from_this()
// 4. 不要循環引用

// 共享指針的繼承關係轉換
std::dynamic_pointer_cast
std::shared_ptr<baseclass> ptrbase;
std::shared_ptr<derivedclass> ptrderived = std::dynamic_pointer_cast<derivedclass>(ptrbase);

weak_ptr

// 常用的三個方法
operator=   進 賦值shared_ptr
expired     判斷shared_ptr是否釋放資源
lock        出 返回shared_ptr

// 類似shared_ptr
reset
swap
use_count

分配器

allocator

 1.分配空間(allocate)

 2.構造(construct)

 3.析構(destroy)

 4.釋放空間(deallocate)

#include <iostream>
#include <memory>
using namespace std;
 
int main(int argc, char* argv[]) 
{
    allocator<string> alloc;
    int n = 10;
    string* p = alloc.allocate(n);
    string* q = p;
    while(q != p+n) 
    {
        alloc.construct(q++, 10, 'w');
        cout << *(q-1) << endl;
    }
    while(q != p) 
    {
        alloc.destroy(--q);
    }
    alloc.deallocate(p, n);
 
    return 0;
}

pair

tuple

直接構造和利用make_tuple來構造,std::tie用來將多個變量綁在一起或解綁,綁定得到是左值引用,解綁就是解構,可以用std::ignore來佔位,不必解構每個值,tuple_cat用來連接pair和tuple

#include <iostream>
#include <string>
#include <tuple>

int main(int argc, char** argv)
{
	unsigned int iNum   = 1;
	unsigned int iAge   = 18;
	std::string  szName = "fang";
	std::tuple<unsigned int, unsigned int, std::string> tuple0(iNum, iAge, szName);
	std::tuple<unsigned int, unsigned int, std::string> tuple1 = make_tuple(iNum, iAge, szName);
	std::tuple<unsigned int&, unsigned int&, std::string&> tuple2 = std::tie(iNum, iAge, szName);
	//std::tuple<unsigned int&&, unsigned int&&, std::string&&> 
	//tuple3 = std::forward_as_tuple(iNum, iAge, szName);
	std::string& szNameTmp1 = std::get<2>(tuple2);
	szNameTmp1 = "zhao";
	std::tuple<unsigned int, unsigned int, std::string, std::string> 
		au1 = std::tuple_cat(tuple1, std::tie(std::string("123")));
	auto au2 = std::tuple_cat(tuple1, std::make_tuple(std::string("123")));
	std::string& szNameTmp2 = std::get<3>(au1);

	unsigned int iNumTmp   = 0;
	unsigned int iAgeTmp   = 0;
	std::string  szNameTmp = "";
	std::tie(std::ignore, iAgeTmp, szNameTmp) = tuple2;

	return 0;
}

hash

例子

// hash example
#include <iostream>
#include <functional>
#include <string>

int main ()
{
  char nts1[] = "Test";
  char nts2[] = "Test";
  std::string str1 (nts1);
  std::string str2 (nts2);

  std::hash<char*> ptr_hash;
  std::hash<std::string> str_hash;

  std::cout << "same hashes:\n" << std::boolalpha;
  std::cout << "nts1 and nts2: " << (ptr_hash(nts1)==ptr_hash(nts2)) << '\n';
  std::cout << "str1 and str2: " << (str_hash(str1)==str_hash(str2)) << '\n';

  return 0;
}
/*
same hashes:
nts1 and nts2: false
str1 and str2: true
*/

其實就是得到一個std::size_t類型的哈希值,hash模板指定類型可參看http://www.cplusplus.com/reference/functional/hash/?kw=hash

hash模板T如需定義類型,hash<SSS> 需定義操作符operator(),同時可能自定義類型須定義operator==操作符

struct SSS {
	string str1;
	string str2;
};
/*
bool operator==(const SSS& lhs, const SSS& rhs) {
	return lhs.str1 == rhs.str1 && lhs.str2 == rhs.str2;
}
*/
template<>
struct std::hash<SSS>
{
	std::size_t operator()(const SSS& s) const
	{
		std::size_t hash1 = std::hash<string>{}(s.str1);
		std::size_t hash2 = std::hash<string>{}(s.str2);
		return hash1 ^ (hash2 << 1);
	}
};

initlizer_list

{} 

聚合類型類

  • 沒有自定義構造函數
  • 無私有和保護的非靜態數據成員
  • 無基類
  • 無虛函數
  • 沒有初始化

C++線程庫

/* 等待1s */
#include <thread>
#include <chrono>
std::this_thread::sleep_for(std::chrono::seconds(1));
/* 條件等待和通知 */
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable_any con;
// 條件等待
std::lock_guard<std::mutex> locker(mtx);
con.wait(mtx);
// 通知條件
con.notify_one();

C++容器庫

順序容器

實現能按順序訪問的數據結構

  • vector
  • list                  雙向鏈表
  • deque            
  • array              靜態數組 c++11
  • forward_list    單向鏈表 c++11

vector array deque 都保留有連續內存,所有存取比較快

deque另外維護首地址,佔用內存較多

list支持高效插入刪除操作

關聯容器

實現能快速查找( O(log n) 複雜度)的數據結構

  • set
  • map
  • multiset
  • multimap

無序關聯容器

提供能快速查找(均攤 O(1) ,最壞情況 O(n) 的複雜度)的無序(哈希)數據結構

  • unordered_set
  • unordered_map
  • unordered_multiset
  • unordered_multimap

容器適配器

容器適配器提供順序容器的不同接口

  • stack                       默認底層容器deque,支持vector、deque、list
  • queue                     默認底層容器deque,支持deque、list
  • priority_queue        默認底層容器vector,支持vector、deque

其他容器

 initlizer_list

 string

C++時間庫

c時間庫<ctime>或者<time.h>

  • time_t      時間類型
  • time         紀元起時間
  • localtime 紀元起時間到日曆時間

c++時間庫<chrono>

duration時間間隔 - nanoseconds microseconds milliseconds seconds minutes hours

  • count計次的計數
  • duration_cast轉換時長到另一個擁有不同嘀嗒間隔的時長

time_point時間點

轉換爲time_t使用

clocks時鐘

system_clock

  • now              返回當前time_point
  • to_time_t      轉換系統時鐘時間點爲 std::time_t
  • from_time_t  轉換 std::time_t 到系統時鐘時間點

steady_clock 暫無

high_resolution_clock 暫無

參考

類似參考 c++標準庫-c++通用工具

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章