CPP笔记

笔记

    • 位的操作
    • 删除元素导致`set`迭代器失效

位的操作

位操作是在计算机中对二进制数进行操作的技术。它们通常用于优化代码性能、实现位掩码和标志操作,以及在位向量、哈希算法和密码学中进行操作。下面是一些常见的位操作技巧:

  1. 位与操作(AND):将两个二进制数的对应位进行逻辑与运算,结果为1的位表示两个数在该位上都为1,可以用来屏蔽或提取特定位的值。

  2. 位或操作(OR):将两个二进制数的对应位进行逻辑或运算,结果为1的位表示两个数中至少有一个为1,可以用来将某些位设置为1。

  3. 位异或操作(XOR):将两个二进制数的对应位进行逻辑异或运算,结果为1的位表示两个数在该位上不同,可以用来进行数据交换或数据反转。

  4. 位取反操作(NOT):对一个二进制数进行逻辑非运算,将每个位的值反转。

  5. 左移操作(<<):将一个二进制数的所有位向左移动指定的位数,相当于将数乘以2的指定幂次。

  6. 右移操作(>>):将一个二进制数的所有位向右移动指定的位数,相当于将数除以2的指定幂次。

  7. 位测试操作:检查一个二进制数的特定位是否为1或0,可以使用位与操作和位移操作来实现。

  8. 位设置操作:将一个二进制数的特定位设置为1或0,可以使用位或操作和位移操作来实现。

  9. 位清除操作:将一个二进制数的特定位设置为0,可以使用位与操作和位移操作来实现。

  10. 位翻转操作:将一个二进制数的特定位取反,可以使用位异或操作和位移操作来实现。

这些是一些常见的位操作技巧,但在实际应用中还有其他更高级的位操作技术。具体使用哪些技巧取决于具体的需求和编程语言的支持。


删除元素导致set迭代器失效

std::set 进行删除操作可能会导致迭代器失效。这是因为 std::set 是一个基于红黑树的关联容器,它维护元素的有序性,并且使用迭代器来访问容器中的元素。

当你对 std::set 进行删除操作时,红黑树的结构可能会发生变化,例如删除节点或重新平衡树。这可能导致之前获取的迭代器指向的元素位置发生变化,从而使得迭代器失效。

要避免迭代器失效,有几种常见的方法:

  1. 使用返回删除元素后的新迭代器:std::seterase 函数会返回一个指向下一个有效元素的迭代器,可以使用它来替代之前的迭代器。

    std::set<int> mySet = {1, 2, 3, 4, 5};
    
    auto it = mySet.find(3);
    if (it != mySet.end()) {
        it = mySet.erase(it);  // 使用返回的新迭代器
    }
    
  2. 使用后缀递增操作符:可以使用后缀递增操作符 ++ 来移动到下一个元素,而不直接使用迭代器。

    std::set<int> mySet = {1, 2, 3, 4, 5};
    
    auto it = mySet.find(3);
    if (it != mySet.end()) {
        mySet.erase(it++);
    }
    
  3. 使用标准库算法和 remove_if:可以使用标准库算法 std::remove_if 配合 lambda 表达式来删除满足特定条件的元素,而不需要手动管理迭代器。

    std::set<int> mySet = {1, 2, 3, 4, 5};
    
    mySet.erase(std::remove_if(mySet.begin(), mySet.end(),
                               [](const int& element) { return element == 3; }),
                mySet.end());
    

总之,当对 std::set 进行删除操作时,请小心处理迭代器的有效性,并使用上述方法来避免迭代器失效。

你可能感兴趣的:(CPP,笔记,c++)