C++简要知识点


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里插入值和使用关键码来访问相应的值变得非常方便而快速。
    // 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[‘a’] is an element
    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])


评论
  目录