--- 1.using声明不应该出现在头文件里 对于某些程序来说 不经意的包含了一些名字 可能会引起一些始料未及的冲突
--- 2.getline:
----------------- string的一个函数 返回流参数 读取换行并抛弃
---源码之一:
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_istream<_Elem, _Traits>& getline(
basic_istream<_Elem, _Traits>& _Istr,
basic_string<_Elem, _Traits, _Alloc>& _Str)
{ // get characters into string, discard newline
return (getline(_STD move(_Istr), _Str, _Istr.widen('\n')));
}
--- 3.string对象和字面值混在一条语句中执行加法操作时 必须严格保证每个加法符号至少一侧是string
--- 4.范围for:
------------------ 有点python中for的感觉 跟auto搭配使用很好
---语法形式:
for (declaration : expression)
statement
--- 5.vector:
----------------- vector 是模板而非类型 声明不要犯低级错误
----------------- 如果组成vector的元素也是vector 那么存在一个问题 老式编译器与新式编译器可能会以不同的标准来判断其合法性
---ex:
vector<vector<int>>;//新标准允许
vector<vector<int> >;//以前的标准规定必须在两个右尖括号后添加空格
----------------- 当确认无法执行列表初始化后 编译器会尝试用默认值初始化来初始化vector对象
---ex:
vector<string> s{ 10,"hello world" };//s是有十个“hello world”元素的向量
---------------- vector声明时只要指明拷贝区域的首元素地址和尾后地址 是可以用数组初始化的
---ex:
vector<int > c(begin(b), end(b));//c中将有“1 2 3 4 5”5个元素
--- 6.严格来说 string对象不属于容器类型 但是它支持很多容器的操作 比如迭代器
--- 7.关于在循环中使用 “!=” 与 “<”(泛型编程):
---------------------------------------------- C++所有标准库的迭代器都定义了"!=" 而大多数没有定义 "<" 同样的事是C++程序员更愿意使用迭代器而非下标 原因在于这种编程风格在标准库提供的所有容器上都有效
--- 8.关于迭代器:
----------------------- 任何改变迭代器对象容量的操作 都会使其失效
----------------------- 若vector和string对象是const类型 则迭代器只能使用const_iterator 不是const类型iterator和const_iterator都可以用
----------------------- C++11提供了手动申请const_iterator所对应的cbegin()和cend()函数
--- 数组:
------------- C++11引入了可返回数组头指针的函数begin()与返回数组尾下一元素的指针end()
---源码:
template<class _Ty,
size_t _Size> inline
constexpr _Ty *begin(_Ty (&_Array)[_Size]) _NOEXCEPT
{ // get beginning of array
return (_Array);
}
template<class _Ty,
size_t _Size> inline
constexpr _Ty *end(_Ty (&_Array)[_Size]) _NOEXCEPT
{ // get end of array
return (_Array + _Size);
}
--- 9.标准库类型限定使用的下标类型必须为无符号类型 内置的下标运算无此要求
--- 10.范围for处理多维数组:
---ex:
int arr[3][4]{
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
//用范围for来遍历arr
for (auto &i:arr){ //需要注意的是 若i不是引用类型
//编译器初始化i时则会将原本的数组形式转换为指向该数组首元素的指针形式
//即由int[4] 变为int *
for (auto j:i) {
cout << j << endl;
}
}