算法常用知识点

//平滑转化类型
static_cast<类型>(变量)
//转发引用,省去拷贝复制步骤
函数(类型& 变量){}
//先想后写,想通后实现会更简单和容易,不要着急
//容器定义在局内,可变长度,对STL函数熟悉,其中许多功能都是实现好了的,多用迭代器(很高级),迭代器(it)用auto来表示其类型(类似于容器类型*,是一个指针),用*it来获取具体下标数值,多用容器内置函数来操纵容器
//对于浮点数的判等,用两者的差小于1e-10作为判断条件,即abs(a-b)<1e-10;
//注意容器内置方法的实参使用后,是用迭代器做实参还是用数值做实参
//将容器对方法的调用的对象想象为手,伸到什么位置就遍历什么位置的容器,如fuck[a].push_back(c);//其中fuck[a]即伸进去的手
//容器不要直接设大小为输入的n,大一丢丢,如n+100,可以防炸,虽然说不知道为什么,但是在使用其内置size()等求长度的函数时,记得减回去,或者如果没有使用容器内置函数,直接开全局数组,大小足够还防炸;
//  0ll,这是一种语法糖,用于将前面的常数转化为后面表示的类型,可用在函数中,如max(0ll,x),x为ll类型,而0默认为int类型,使用0ll就会统一类型

vector容器删除元素相关函数:

单独使用remove,不会改变容器大小

#include <iostream>
#include <vector>
#include <algorithm>			// [注意] :remove位于algorithm函数库中
int main()
{
    std::vector<int> vecInt{0, 1 , 2 ,3 ,4};

    std::cout << vecInt.size() << std::endl;     // 输出的结果为5,容器中存了5个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量

    std::remove(vecInt.begin(), vecInt.end(),3);
    
    std::cout << vecInt.size() << std::endl;     // 输出的结果为5,容器中存了5个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量

    for(auto i : vecInt)
    {
        std::cout << i << std::endl;
    }
}
// 使用remove之前,容器vector的值为: 0,1,2,3,4
// 使用remove函数删除值为3的元素后,容器vector的值为:0,1,2,4,4
// 可以看出remove,没有改变容器的size,只是将值为3的元素删除后,将后面的元素,移动到前面(后面的值还保留,因此最后是4)。

earse和remove配合使用,会改变容器大小

#include <iostream>
#include <vector>
#include <algorithm>		// [注意] :remove位于algorithm函数库中
int main()
{
    std::vector<int> vecInt{0, 1 , 2 ,3 ,4};

    std::cout << vecInt.size() << std::endl;     // 输出的结果为5,容器中存了5个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量

    vecInt.erase(std::remove(vecInt.begin(), vecInt.end(), 3), vecInt.end());
    
    std::cout << vecInt.size() << std::endl;     // 输出的结果为4,容器中存了4个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量

    for(auto i : vecInt)
    {
        std::cout << i << std::endl;
    }
}
// 使用remove之前,容器vector的值为: 0,1,2,3,4
// 使用remove函数删除值为3的元素后,容器vector的值为:0,1,2,4,
// 可以看出remove,容器的size变成了size-1,删除了值为3的元素。容器的capacity不变

注意:

  • remove位于algorithm函数库中,使用时需要调用algorithm头文件。
  • earse和remove不改变vector的容量capacity,(不会收回容器在内存中开辟的空间)

2. 使用swap删除容器的所有元素,并收回内存

  • 使用clear清空容器中的元素
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> vecInt{0, 1 , 2 ,3 ,4};

    std::cout << vecInt.size() << std::endl;     //  输出的结果为5,容器中存了5个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量

    vecInt.clear();					// 使用clear清空容器
    
    std::cout << vecInt.size() << std::endl;     // 输出的结果为0,容器中存了0个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量
}

可以看出使用clean可以清空vector,但是不会改变capacity,(不会收回容器在内存中开辟的空间)。

  • 使用swap清空容器中的元素
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> vecInt{0, 1, 2, 3, 4};

    std::cout << vecInt.size() << std::endl;      //  输出的结果为5,容器中存了5个元素
    std::cout << vecInt.capacity() << std::endl;  //  输出的结果为5,容器在内存开辟空间的容量

    std::vector<int>().swap(vecInt);		// 使用swap函数,将容器与空的容器交换,从而删除容器数据,并且收回内存
    
    std::cout << vecInt.size() << std::endl;     // 输出的结果为0,容器中存了0个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为0,容器在内存开辟空间的容量
}

使用swap函数,将容器与空的容器交换,从而删除容器所有数据,并且收回内存。

注意:

这里没有为 std::vector() 表达式传递任何参数。这意味着,此表达式将调用 vector 模板类的默认构造函数,而不再是复制构造函数。也就是说,此格式会先生成一个空的 vector 容器,再借助 swap() 方法将空容器交换给 vecInt,从而达到清空 vecInt 的目的。

3. 使用shrink_to_fit()配合其他函数,删除元素并回收内存。

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> vecInt{0, 1, 2, 3, 4};

    vecInt.pop_back(); 				// 删除容器中的最后一个元素
    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的数量为4
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量为5。
    
    vecInt.shrink_to_fit();				//  将vector 容器的容量缩减至和实际存储元素的个数相等
    
    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的数量为4
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量为4。
    
    vecInt.clear();				//清空容器

    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的数量为0
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量为4。

    vecInt.shrink_to_fit();			//  将vector 容器的容量缩减至和实际存储元素的个数相等

    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的数量为0
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量为0。
}

快速异或算法:

求0到MEX累计异或后的值快了200倍左右吧):

 int mex_a = (MEX % 4 == 0)   ? 0
              : (MEX % 4 == 1) ? MEX - 1
              : (MEX % 4 == 2) ? 1
                               : MEX;

估算代码时间:

1e9约为1秒,根据数据规模计算即可

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部