1. vector 的 front()
和 back()
vector.front()
和 vector.back()
在空容器上調用會導致未定義的行為。
所以捎谨,如果想要使用 front()
和 back()
肢预,需要滿足容器不為空。
if (!arr.empty())
{
// arr.front();
// arr.back();
}
2. unordered_map 賦值后不保證順序
unordered_map 是基于哈希表的無序結構略板,在將 unordered_map 對象賦值給一個新的 unordered_map 時酸茴,前后兩個 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;
}
// 結果
// 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. 獲取對象類型
C++ 中使用typeid()
來獲取對象的類型信息
#include <iostream>
#include <typeinfo>
int main() {
int i;
std::cout << "i type is: " << typeid(i).name() << '\n';
return 0;
}
// 結果
// i is: int
4. decltype
decltype
用于選擇并返回操作數的數據類型,解決復雜的類型聲明漠畜。
- 作用于變量:得到變量的類型
- 作用于表達式:左值的表達式得到類型的引用币他;右值的表達式得到類型。且都不計算表達式的值
- 作用于函數名:得到函數類型憔狞,不轉換成指針
auto蝴悉、typeid、decltype區(qū)別:
- auto:推到類型瘾敢,且必須初始化
- typeid:獲取類型拍冠,可用于類型的比較
- decltype:獲取類型,僅用于聲明
decltype
的使用場景:用于聲明模板函數簇抵,此模板函數的返回值類型依賴于其參數類型
// 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;
}
// 在其所調用的函數返回引用的情況下
// 函數調用的完美轉發(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 不能從花括號初始化器列表推導
{
return { n, n + 1 };
}
int main()
{
auto arr = f<9>();
std::cout << "arr.first :" << arr.first << " arr.second :" << arr.second << std::endl;
return 0;
}
// 結果
// arr.first :9 arr.second :10