工作小結(jié) 22.04.07

1. vector 的 front()back()
vector.front()vector.back() 在空容器上調(diào)用會(huì)導(dǎo)致未定義的行為。
所以,如果想要使用 front()back(),需要滿足容器不為空。

if (!arr.empty()) 
{
    // arr.front();
    // arr.back();
}

2. unordered_map 賦值后不保證順序
unordered_map 是基于哈希表的無(wú)序結(jié)構(gòu),在將 unordered_map 對(duì)象賦值給一個(gè)新的 unordered_map 時(shí),前后兩個(gè) unordered_map 的元素順序是不一致的。

std::unordered_map<int, std::string> um;
um.emplace(1001, "111");
um.emplace(1012, "222");
um.emplace(1023, "333");
um.emplace(1044, "444");
um.emplace(1005, "555");
um.emplace(1016, "666");

for (auto const & i : um) {
    std::cout << i.first << " " << i.second << std::endl;
}

std::cout << "----------------------" << std::endl;

auto new_um = um;
for (auto const& i : new_um) {
    std::cout << i.first << " " << i.second << std::endl;
}

// 結(jié)果
// 1044 444
// 1001 111
// 1012 222
// 1023 333
// 1005 555
// 1016 666
// ----------------------
// 1001 111
// 1044 444
// 1012 222
// 1023 333
// 1005 555
// 1016 666

3. 獲取對(duì)象類型
C++ 中使用typeid()來(lái)獲取對(duì)象的類型信息

#include <iostream>
#include <typeinfo>

int main() {
  int i;
  std::cout << "i type is: " << typeid(i).name() << '\n';
  return 0;
}

// 結(jié)果
// i is: int

4. decltype
decltype用于選擇并返回操作數(shù)的數(shù)據(jù)類型,解決復(fù)雜的類型聲明。

  • 作用于變量:得到變量的類型
  • 作用于表達(dá)式:左值的表達(dá)式得到類型的引用;右值的表達(dá)式得到類型。且都不計(jì)算表達(dá)式的值
  • 作用于函數(shù)名:得到函數(shù)類型,不轉(zhuǎn)換成指針

auto、typeid、decltype區(qū)別:

  • auto:推到類型,且必須初始化
  • typeid:獲取類型,可用于類型的比較
  • decltype:獲取類型,僅用于聲明

decltype的使用場(chǎng)景:用于聲明模板函數(shù),此模板函數(shù)的返回值類型依賴于其參數(shù)類型

// C++ 11
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u)
{
    return t + u;
}


// C++ 14
template<typename T, typename U>
auto add(T t, U u)
{
    return t + u;
}
// 在其所調(diào)用的函數(shù)返回引用的情況下
// 函數(shù)調(diào)用的完美轉(zhuǎn)發(fā)必須用 decltype(auto)
template<class F, class... Args>
decltype(auto) PerfectForward(F fun, Args&&... args) 
{ 
    return fun(std::forward<Args>(args)...); 
}


// C++17  支持 auto 形參聲明
template<auto n>
auto f() -> std::pair<decltype(n), decltype(n)> // auto 不能從花括號(hào)初始化器列表推導(dǎo)
{
    return { n, n + 1 };
}

int main() 
{
    auto arr = f<9>();
    std::cout << "arr.first :" << arr.first << " arr.second :" << arr.second << std::endl;
    return 0;
}
// 結(jié)果
// arr.first :9 arr.second :10
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 抱佛腳一時(shí)爽,一直抱佛腳一直爽!這篇文章總結(jié)常見的c++面試問(wèn)題~因?yàn)槭潜Х鹉_,所以結(jié)構(gòu)上沒(méi)有什么邏輯...參考鏈...
    山幺幺閱讀 802評(píng)論 0 0
  • c++學(xué)習(xí)文檔匯總 [TOC] c++ primer部分 c++學(xué)習(xí)筆記 引用(左值引用) int &ref...
    flyrain閱讀 477評(píng)論 0 0
  • 自動(dòng)類型推導(dǎo) 現(xiàn)代的編程語(yǔ)言,不管是動(dòng)態(tài)語(yǔ)言(JavaScript、Python 等),還是靜態(tài)語(yǔ)言(Go、Rus...
    linjinhe閱讀 932評(píng)論 0 0
  • 官方答案2 思路:和常規(guī)方法一樣,還是通過(guò)查找target-nums[i]尋找下表,但是用建立哈希表替代遍歷。 u...
    AnthonyM08閱讀 163評(píng)論 0 0
  • 一、C語(yǔ)言基礎(chǔ) 1、struct 的內(nèi)存對(duì)齊和填充問(wèn)題其實(shí)只要記住一個(gè)概念和三個(gè)原則就可以了: 一個(gè)概念:自然對(duì)齊...
    XDgbh閱讀 2,348評(píng)論 1 38

友情鏈接更多精彩內(nèi)容