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++通用工具