c++中std::set的高效插入技术
Efficient insertion technique for std::set C++
这是一个更好的(更优化或更快的技术)代码:
查找+插入
for(int i = 0; i < A.length(); i++){
set<char> s;
s.insert(A[i]);
len = 1;
for(int j = i+1; j < A.length(); j++){
if(s.find(A[j]) == s.end()){
s.insert(A[j]);
}
else{ //Duplicate char found so break
break;
}
len++;
}
if(len > maxm) maxm = len;
s.clear();
}
或
Insert + usereturndpair
for(int i = 0; i < A.length(); i++){
set<char> s;
pair<set<char>::iterator, bool> ret;
s.insert(A[i]);
len = 1;
for(int j = i+1; j < A.length(); j++){
ret = s.insert(A[j]);
if(ret.second == false) break; //using *pair* returned from set::insert
len++;
}
if(len > maxm) maxm = len;
s.clear();
}
在我看来,后一个看起来更优化,因为它摆脱了set::find
的额外开销。我的观察正确吗?哪一个更值得推荐?
第二个版本稍微快了一点(VS 2015, Debug x86):
A.length() == 564
1) 62ms
2) 56ms
第二个版本快一点的原因是因为std::set::insert
已经在它的容器中搜索了一个可能的副本。这意味着在第一个版本中,您要搜索集合2次,而第二个版本只搜索1次。
请注意,启用优化后,两个版本的时间都减少到不到1ms,所以基本上"没关系"。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- C++中高效的大型稀疏块压缩线性方程
- 预处理器:插入结构名称中的前一个行号
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如何在c++中只将键插入到bimap的一侧
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如何将结构插入到集合中并打印集合的成员
- C++json插入数组
- Visual Studio 2019:插入多个C++风格的单行注释
- nlohmann-json将一个数组插入到另一个数组中
- 有效地使用std::unordered_map来插入或增加键的值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 正在插入动态数组
- 插入或删除时获取usb的dos_name
- 如何在C++中高效地构造随机骰子
- 叮叮当当在修复时插入多个"覆盖"说明符
- C++:用于高效插入和检索自定义数据的数据结构
- 如何在矢量中高效、正确地插入对象
- c++中std::set的高效插入技术