文章目录
1.头文件不应使用using声明
作为头文件,一般不要使用using.因为作为头文件,可能被其它文件应用.那么就会把using带过去.造成无法预料的名字冲突;
2.字符串
1.拷贝初始化和直接初始化
string s3 = "hello"; //拷贝初始化
string s4("hello"); //直接初始化.两者等价
//对于一些特殊字符串,比如 n 个 'c'这种,建议用直接初始化!因为拷贝初始化需要显性创建一个对象
string s5(n,'c'); //推荐
string s6 = string(n,'c'); //不推荐
等价于
{
string temp(n,'c');
s6 = temp;
}
2.读取一行getline()
输入想要保留换行符,用
getline
代替cin
;
3.size(),length()
注意点
string.size().string.length()
的返回值均为size_type
,是一个unsigned int类型.如果与负数比较,需要注意会负数会为正数.
4.相加
//!字符串字面值与string类型不是同一个类型!
string str = " hello," + "world "; //错误,两个字面值不能直接相加
string str = " hello," + "world " + str; //错误.两个字面值不能直接相加
string str = str + " hello," + "world "; //正确
5.初始值
//创建一个字符串时,默认有'\0’;所以合法
string s;
cout << s[0] << endl;
3.vector
1.函数
申请一个容器 | vector<(int,类,vector容器嵌套)> v |
---|---|
v1 = v2 | 容器赋值,等于另外一个容器 |
assign(v2开始点,v2结束点)/assign(n,elem) | 用v2赋值[左闭右开) /赋值n个elem |
push_back() | 尾插 |
pop_back() | 删除最后一个 |
iinsert(const_iterator pos,[int count,]elem) | pos位置插入[count]个elem数据 |
erase(const_iterator start,const_iterator end) | 从start到end间的元素 [左闭右开) |
empty() | 真则为空 |
capacity() | 容量 |
size() | 元素个数 |
resize(int number) | 重新指定容器长度若容器变长,就以0填充,变短就删除超出部分 |
resize(int number,elem) | 重新指定长度,若容器变长,就以elem值填充,变短就删除超出部分 |
at() | 访问元素, v.at[i] = v[i] |
front() | 第一个元素 |
back() | 最后一个元素 |
swap() | 两个容器交换数据 --巧用来收缩空间 vector(v).swap(v) 匿名对象交换 |
reserve(int len) | 预留空间(元素不能访问) |
clear(); | 清除全部 |
2.赋值
vector<string> str1("10", "hi"); //{10,hi}
vector<string> str2(10, "hi"); //10个hi
vector<string> str3{10, "hi"}; //10个hi
vector<int> str4(10, 1); //10个1
vector<int> str5{ 10, 1 }; //{10,1}
3.可以直接对值进行操作
vector<int> v{ 1,2,3,4,5,6,7 };
for (auto &i : v)
i *= i; //可以使得所有值都平方
4.容器的二分查找
vector<int>::iterator beg = v.begin();
vector<int>::iterator end = v.end();
vector<int>::iterator mid = v.begin() + (end - beg) / 2;
int sought = 3;
while (beg != end && *mid != sought)
{
if (sought < *mid)
end = mid;
else
beg = mid + 1;
mid = beg + (end - beg) / 2;
}
5.!注意!:
- 在使用循环,容器大小作为循环次数时,是不要添加元素,会陷入死循环.
4.迭代器
1.类型
//两种类型
iterator //普通迭代器,能读能写 容器.begin(), .end();
const_iterator //常量迭代器,只能读不能写 容器.cbegin(),.cend();
2.解引用
(*it).empty() = it->empty() //如果解引用对象有该函数即正确
*it.empty() //错误,圆括号不可少
3.迭代器运算
运算 | 作用 |
---|---|
iter +n | 加上一个整数值还是一个迭代器,向前移动n个元素 |
iter - n | 减上一个整数值还是一个迭代器,向后移动n个元素 |
iter += n | 赋值语句,把迭代器里的值加上n后赋值给迭代器的值 |
iter -= n | 赋值语句,把迭代器里的值减去n后赋值给迭代器的值 |
iter1 - iter2 | 两个迭代器相减结果为它们间的距离 |
5.数组
char a1[] = {'C','+','+'}; //列表初始化,没有空字符结尾
char a2[] = {'C','+','+','\0'}; //列表初始化,显性空字符结尾
char a3[] = "c++"; //自动添加空字符结尾
char a4[6] = "Daniel"; //错误,没有位置放空字符
6. C风格字符串
函数 | 意义 |
---|---|
strlen§ | 返回p的长度,空字符不计算在内.必须有’\0’结尾 |
strcmp(p1 ,p2 ) | 比较p1 和p2 的相等性。如果p1 ==p2 ,返回0;如果p1 >p2 ,返回一个正值;如果p1 <p2 ,则返回一个负值 |
strcat(p1 ,p2 ) | 将p2 附加到p1 之后,返回p1 |
strcpy(p1 ,p2 ) | 将p2 拷贝给p1 ,返回p1 |
char[] 不能直接比较,只能用strcmp