首页 > 其他分享 >一些值得注意的STL使用,用错了可能就复杂度错误了

一些值得注意的STL使用,用错了可能就复杂度错误了

时间:2024-11-18 19:30:35浏览次数:1  
标签:std 用错 STL 复杂度 bytes mrand 512 uint32 first

前言

一些见到(或看到别人,或写了)的问题就记一下吧

正文

lower_bound

STL分为两类,一类是支持随机访问的,另一类是不支持随机访问的。而不支持随机访问的,若使用lower_bound函数,请一定要使用.... .lower_bound(...),因为这样的复杂度是对的(\(\log\)),否则就是线性的。我在cpprefernce上没有翻到非常有用的资料,用duck做了个bench。结果如下:

code 1:

# include <bits/stdc++.h>

std::mt19937 mrand(std::chrono::steady_clock::now().time_since_epoch().count());

uint32_t rnd(uint32_t L, uint32_t R){return mrand() % (R - L + 1) + L; }

constexpr int N = 5e5;

# define ALL(x) x.begin(), x.end()

uint32_t A[N];

signed main() {
	std::set<int> S;
	for (uint32_t i = 1; i <= N; i++)
		S.insert(mrand());
	uint32_t kth;
	std::cin >> kth;
	assert(kth <= N);
	for (uint32_t i = 0; i < N; i++) {
		auto it = std::lower_bound(ALL(S), mrand());
		if (it == S.end()) A[i] = (uint32_t)(-1);
		else A[i] = *it;
	}
	std::nth_element(A, A + kth, A + N);
	std::cout << A[kth - 1] << "\n";
}

结果:

Submitting ...
Compile OK
Time (ms): 1000
Memory (KiB): 23476
Status: Time Limit Exceeded
>>>>>>> stdout (first 512 bytes) <<<<<<<

>>>>>>> stderr (first 512 bytes) <<<<<<<

========================================

code 2:

# include <bits/stdc++.h>

std::mt19937 mrand(std::chrono::steady_clock::now().time_since_epoch().count());

uint32_t rnd(uint32_t L, uint32_t R){return mrand() % (R - L + 1) + L; }

constexpr int N = 5e5;

# define ALL(x) x.begin(), x.end()

uint32_t A[N];

signed main() {
	std::set<int> S;
	for (uint32_t i = 1; i <= N; i++)
		S.insert(mrand());
	uint32_t kth;
	std::cin >> kth;
	assert(kth <= N);
	for (uint32_t i = 0; i < N; i++) {
		auto it = S.lower_bound(mrand());
		if (it == S.end()) A[i] = (uint32_t)(-1);
		else A[i] = *it;
	}
	std::nth_element(A, A + kth, A + N);
	std::cout << A[kth - 1] << "\n";
}

结果:

Submitting ...
Compile OK
Time (ms): 483.526877
Memory (KiB): 25428
Status: Run Finished
>>>>>>> stdout (first 512 bytes) <<<<<<<
3293214969

>>>>>>> stderr (first 512 bytes) <<<<<<<

========================================

显然跑得了5e5的那个是log的,另一个不是log的。

string加入相关

这个是同学在写题的时候写出来问题然后反应过来的。

他需要动态的将一个char放到string后面

他的写法是:

string s; char c;
s = s + c;

这一看是不是没有问题,我们在正常写加减法运算的时候就会习惯性的这么写(有些人喜欢这么写,不包括我)。我去翻了一下cppreference,发现+一个char的操作是给s进行push_back操作,然后在复制过去,就不是\(\mathcal{O(1)}\)的了。而是\(\mathcal{O(size_{S})}\)的。但是push_back是\(\mathcal{O(1)}\)的。

具体的在这儿

标签:std,用错,STL,复杂度,bytes,mrand,512,uint32,first
From: https://www.cnblogs.com/georgeyucjr/p/18553463

相关文章

  • 解题报告——灵活利用题目单调性省下复杂度
    有一种题目,需要直接/间接查询全局最值,并且带修改。直接set/priority_queue不完了吗?然而,这类题目通常具有巨大的操作量,朴素的需要额外复杂度来维护内部性质的数据结构(例如需要带一个\(\log\))往往无法通过此类题目。但是,这种题目本身一般具有某种单调性质,这使得我们可以使用一......
  • C++ stl chrono 学习笔记
    chronosinceC++11库的参考手册(英文)|cppreferencechrono库定义了三种(直到c++20)五种(从c++20开始)主要类型以及实用函数和常用类型:cokckstimepointsdurationscalendardates(sinceC++20)timezoneinformation(sinceC++20)clocks时钟由起点(或历元)和滴答率组成......
  • C++时间复杂度讲解
    它约等于算法中基本操作重复执行的次数(循环或递归的次数)不是行数!!!最多为O(5)!!!用乘号连接(在嵌套循环中),时间复杂度用O()表示。(O()只是符号)如:for(int=1;i<=n*10/8;i++){      for(intj=1;j<=n*10/2;k++){             for(intk=1;k<n*10;k++)......
  • STL之动态数组
    一、标准模板库(StandardTemplateLibrary,STL)是HP公司开发的一个C++模板库,包含一些常用的数据结构和算法。具有以下的组件:1.容器:容纳包含一组元素的对象。2.迭代器:提供访问容器的方法3.函数对象4.算法二、STL之向量——vector   vector是c++标准库提供的一个变长数......
  • 【11.16T1 公路】 --时间复杂度的计算技巧
    给定\(n\)个点\(m\)条边的无向简单连通图,每条边有颜色\(c_i\),当第\(k\)次经过颜色为\(j\)的边时,需要花费\(k\cdotx_j\)的代价。求在经过边数最小的情况下,\(1\)到各个点的最短路\(n\le50,m\le\binom{n}{2},x_i\le10^4\)做法是简单的,直接处理出最短路\(DAG\)......
  • 服务注册自治,降低 ASP.NET Core Web API 依赖注入的耦合度和复杂度
    前言在软件的实际开发中,一个软件通常由多个项目组成,这些项目都会直接或者间接被主ASP.NETCore项目引用。这些项目中通常都会用到若干个被注入的服务,因此我们需要在主ASP.NETCore项目的Program.cs中注册这些服务。这样不仅会增加了Program.cs管理的复杂度,而且也增加了......
  • 2024/11/13日 日志 代码优化 以及 JSP 的快速入门、原理、脚本、缺点 和 EL表达式 以
    代码优化--创建SqlSessionFactory代码优化点击查看代码--//2.1获取SqlSessionFactory对象--Stringresource="mybatis-config.xml";--InputStreaminputStream=Resources.getResourceAsStream(resource);--SqlsessionFactorysqlSessionFactory=newSqlSessio......
  • 【C++】STL--queue、deque、priority的模拟实现和应用
    目录1、queue的介绍1.2queue的常规操作 2、queue的模拟实现 3、priority_queue(优先级队列)的介绍和实现3.1priority_queue的使用 3.2 priority_queue的应用 3.3 priority_queue的模拟实现4、deque4.1deque的原理介绍4.2deque的缺陷4.3 为什么选择deque作......
  • STL标准模板库c++
    STL:广义上分为:容器,算法,迭代器容器与算法间通过迭代器进行无缝连接。STL六大组件,分别是容器,算法,迭代器,仿函数,适配器,空间配置器。vector容器可以理解为数组;为单端数组,区别在于数组为静态空间,而vector可以动态扩展动态扩展:不是在原空间下,找到更......
  • STL容器的各个函数方法
    std::vectorstd::vector是一个动态数组,支持随机访问。push_back(value):在末尾添加一个元素。pop_back():移除末尾的元素。size():返回容器中的元素数量。empty():检查容器是否为空。at(index):访问指定位置的元素,带边界检查。front():返回第一个元素。back():返回最后一个元......