C++简要知识点
左值与右值
左值 (lvalue, locator value) 表示了一个占据内存中某个可识别的位置(也就是一个地址)的对象。
右值 (rvalue) 则使用排除法来定义。一个表达式不是 左值 就是 右值 。 那么,右值是一个 不 表示内存中某个可识别位置的对象的表达式。
- 需要一个右值参数,但返回一个左值结果
& 需要一个左值参数,返回一个右值int arr[] = {1, 2}; int* p = &arr[0]; *(p + 1) = 10; // 正确: p + 1 是右值,但 *(p + 1) 是左值
int var = 10; int* bad_addr = &(var + 1); // 错误: 一元 '&' 操作符需要左值参数 int* addr = &var; // 正确: var 是左值 &var = 40; // 错误: 赋值操作的左操作数需要是左值
emplace_back
emplace_back只调用构造函数,没有移动构造函数,也没有拷贝构造函数。move()
移动所做的事情取决于移动构造函数和移动赋值函数的实现。对大多数 STL 容器来说,所做的事情就是两件:进行浅拷贝;拷贝完之后将源对象中的指针置为 nullptr,防止其被释放。
因此 vector 内部的指针是被直接移走的,并且不会调用元素类型的移动赋值函数,地址一样。count
map和set两种容器的底层结构都是红黑树,所以容器中不会出现相同的元素,因此count()的结果只能为0和1,可以以此来判断键值元素是否存在(当然也可以使用find()方法判断键值是否存在)。
拿map< key,value >举例,find()方法返回值是一个迭代器,成功返回迭代器指向要查找的元素,失败返回的迭代器指向end。count()方法返回值是一个整数,1表示有这个元素,0表示没有这个元素。map[]
map的下标操作符[]使用上面的方法定义,
使向map里插入值和使用关键码来访问相应的值变得非常方便而快速。
mymap[‘a’] is an element// accessing mapped values #include <iostream> #include <map> #include <string> int main () { std::map<char,std::string> mymap; mymap['a']="an element"; mymap['b']="another element"; mymap['c']=mymap['b']; std::cout << "mymap['a'] is " << mymap['a'] << '\n'; std::cout << "mymap['b'] is " << mymap['b'] << '\n'; std::cout << "mymap['c'] is " << mymap['c'] << '\n'; std::cout << "mymap['d'] is " << mymap['d'] << '\n'; std::cout << "mymap now contains " << mymap.size() << " elements.\n"; return 0; }
mymap[‘b’] is another element
mymap[‘c’] is another element
mymap[‘d’] is
mymap now contains 4 elements
字符串长度计算
在这里我提供四种方法计算字符串的长度:
1.使用递归函数。
2.数数,从第一个字符开始数数,没遇到一个字符,长度加一,直到遇到”\0”,停止数数。
3.使用strlen函数,使用此函数时,需包含头文件 include < string.h >
4.使用sizeof,对于字符串,一定要减去1,因为字符数组的末尾有一个”\0”,size=sizeof(str)/sizeof(str[0])