stl

高效的使用STL

血红的双手。 提交于 2020-01-26 18:45:13
高效的使用STL 仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍; 熟悉以下条款,高效的使用STL; 当对象很大时,建立指针的容器而不是对象的容器 1)STL基于拷贝的方式的来工作,任何需要放入STL中的元素,都会被复制; 这也好理解,STL工作的容器是在堆内开辟的一块新空间,而我们自己的变量一般存放在函数栈或另一块堆空间中;为了能够完全控制STL自己的元素,为了能在自己的地盘随心干活;这就涉及到复制; 而如果复制的对象很大,由复制带来的性能代价也不小 ; 对于大对象的操作,使用指针来代替对象能消除这方面的代价; 2)只涉及到指针拷贝操作, 没有额外类的构造函数和赋值构造函数的调用; vecttor <BigObj> vt1; vt1.push_bach(myBigObj); vecttor <BigObj* > vt2; vt2.push_bach(new BigObj()); 注意事项: 1)容器销毁前需要自行销毁指针所指向的对象;否则就造成了内存泄漏; 2)使用排序等算法时,需要构造基于对象的比较函数,如果使用默认的比较函数,其结果是基于指针大小的比较,而不是对象的比较; 用empty() 代替size()来检查是否为空 因为对于list,size()会遍历每一个元素来确定大小,时间复杂度 o(n),线性时间;而empty总是保证常数时间;

C++STL模板类vector

▼魔方 西西 提交于 2020-01-26 16:59:49
文章目录 一、定义 二、常用操作 三、代码实现 STL(Standard Template Library)是C++的标准模板库,竞赛中很多常用的数据结构、算法在STL中都有,熟练地掌握它们在很多题目中能极大地简化编程。 vector容器是一个模板类,能存放任何类型的对象。 vector:动态数组,从末尾能快速插入与删除,直接访问任何元素 一、定义 定义int型数组 (也可使char、double等类型) # include <iostream> # include <vector> using namespace std ; int main ( ) { vector < int > a ; //默认初始化,a为空 vector < int > b ( a ) ; //用a定义b vector < int > a ( 100 ) ; //a有100个值为0的元素 vector < int > a ( 100 , 6 ) ; //a有100个值为6的元素 } 定义string型数组 # include <iostream> # include <vector> using namespace std ; int main ( ) { vector < string > a ( 10 , "null" ) ; //10个值为null的元素; vector < string > vec

STL版本

℡╲_俬逩灬. 提交于 2020-01-26 13:28:51
STL - Standard Template Library , 是C++标准里面规定的 模板库接口规范 ,但它只是接口规范,没有规定具体怎么实现。 STL是C++标准的一部分,所以每个C++编译器都会至少带一份STL实现。当然除了这些C++编译器带的实现外,还有一些独立的STL实现。 GNU STL GCC带的STL实现,包含在libstdc++这个库里面,写C++一旦用到库函数是基本会链接这个库。GNU STL是在SGI的STL基础上开发的。 侯捷的《STL源码剖析》也是围绕SGI的STL进行讨论的。 https://gcc.gnu.org/onlinedocs/libstdc++/ https://community.hpe.com/t5/Servers-The-Right-Compute/SGI-com-Tech-Archive-Resources-now-retired/ba-p/6992583 VC++ STL 这是微软的Visual C++附带的STL实现,你可以在VC++的安装目录里找到源码。 STLport: 是由STLport公司开发和维护的跨编译器的可移植的STL实现,支持数十种主流C++编译器。 参考链接: https://zhuanlan.zhihu.com/p/23016264 来源: https://www.cnblogs.com/yy

C++ | STL 概述

拈花ヽ惹草 提交于 2020-01-25 16:56:05
在C++标准中,STL被组织为下面的17个头文件:<algorithm>、<deque>、<functional>、<iterator>、<array>、<vector>、<list>、<forward_list>、<map>、<unordered_map>、<memory>、<numeric>、<queue>、<set>、<unordered_set>、<stack>和<utility> 序列式容器 向量(vector) 连续存储的元素<vector> 列表(list) 由节点组成的双向链表,每个结点包含着一个元素<list> 双端队列(deque) 连续存储的指向不同元素的指针所组成的数组<deque> 容器适配器 栈(stack) 后进先出的值的排列 <stack> 队列(queue) 先进先出的值的排列 <queue> 优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 <queue> 关联式容器 集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 <set> 多重集合(multiset) 允许存在两个次序相等的元素的集合 <set> 映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列 <map> 多重映射

How to use std::for_each on a map element method with input?

烂漫一生 提交于 2020-01-24 11:11:27
问题 I have: struct Mystruct { void Update(float Delta); } typedef std::map<int, Mystruct*> TheMap; typedef TheMap::iterator TheMapIt; TheMap Container; and wants to do: for(TheMapIt It = Container.begin(), Ite = Container.end(); It != Ite; ++It) { It->second->Update(Delta); } using std::for_each , how to do this? I think I can declare function like: void Do(const std::pair<int, Mystruct*> Elem) { Elem->Update(/*problem!*/); ---> How to pass Delta in? } Or make another struct: struct Doer { Doer

How to use std::for_each on a map element method with input?

ぃ、小莉子 提交于 2020-01-24 11:10:50
问题 I have: struct Mystruct { void Update(float Delta); } typedef std::map<int, Mystruct*> TheMap; typedef TheMap::iterator TheMapIt; TheMap Container; and wants to do: for(TheMapIt It = Container.begin(), Ite = Container.end(); It != Ite; ++It) { It->second->Update(Delta); } using std::for_each , how to do this? I think I can declare function like: void Do(const std::pair<int, Mystruct*> Elem) { Elem->Update(/*problem!*/); ---> How to pass Delta in? } Or make another struct: struct Doer { Doer

标准模板库STL介绍

醉酒当歌 提交于 2020-01-24 11:01:49
库是一系列程序组件的集合,他们可以在不同的程序中重复使用。C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出、数学计算等功能。 1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器、迭代器、算法。 STL的最大特点就是: 数据结构和算法的分离,非面向对象本质。访问对象是通过象指针一样的迭代器实现的; 容器是象链表,矢量之类的数据结构,并按模板方式提供; 算法是函数模板,用于操作容器中的数据。由于STL以模板为基础,所以能用于任何数据类型和结构。 容器可以分为三种主要类型: 序列容器、关联容器、容器适配器。 每种STL容器都具有相关联的成员函数,这些成员函数的一个子集在所有的STL容器中都定义了。 STL迭代器的属性和指针类似,程序可以利用迭代器操作STL容器中的元素 STL算法是用于执行常见数据操作的函数,这些操作包括搜索、排序和比较元素,STL提供了大约70种算法,其中大多数算法都使用迭代器来访问容器元素。 1.1 容器简介 容器可以分为三种:序列容器、关联容器、容器适配器。 序列容器 :vector deque list Vector:可从后端执行快速的插入和删除,直接访问任何元素 Deque:从前面或后面执行快速的插入和删除,直接访问任何元素 List

STL的使用和背后数据结构

拟墨画扇 提交于 2020-01-24 11:00:43
STL(Standard Template Library即,模板库)包括六个部分:容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors) vector 1、vector:连续存储 (1)头文件,#include<vector> (2)创建vector对象,vector<int> vec; (3)尾部插入元素,vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl; (5)使用迭代访问元素 1 vector<int>::iterator it; 2 for(it=vec.begin();it!=vec.end();it++) 3 cout<<(*it)<<endl; (6)插入元素,vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a (7)删除元素,vec.erase(vec.begin()+2);删除第3个元素         vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始 (8)向量大小,vec.size(); (9)清空,vec.clear(); vector的元素不仅仅只限于int型,int、double

STL综合 容器常用集合 —— hyl天梦

心已入冬 提交于 2020-01-24 10:35:11
STL 标准模板库 容器 用法集结 NO.1 stack 栈 注:取自 https://www.cnblogs.com/aiguona/p/7200837.html 库 #include<stack> 定义方式 stack<_template> s;//参数也是数据类型,这是栈的定义方式 常用操作 s.empty()//如果栈为空返回true,否则返回false s.size()//返回栈中元素的个数 s.pop()//删除栈顶元素 但不返回 其值 s.top()//返回栈顶的元素,但不删除该元素 s.push(X)//在栈顶压入新元素 ,参数X为要压入的元素 For exanple: #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <stack> using namespace std; int main() { stack<char> s; s.push(a); cout << s.top() <<endl; s.push(b); cout << s.top(); s,pop(); cout << s.top(); return 0; } NO.2 queue 队列 注:取自 https://www.cnblogs.com/aiguona/p

C++: why does calling std::wstring::begin() before #include <vector> cause a compiler error in this code?

╄→гoц情女王★ 提交于 2020-01-24 07:44:19
问题 This code: #include <string> void blah() { std::string str; str.begin(); } #include <vector> template <template <class...> class T, class U, class V, class ... Rest> T<V> foo(const T<U, Rest...> &container, const V &arg) { (void)container; return T<V>({arg}); } int main() { auto result = foo(std::vector<int>{1, 2, 3, 4, 5}, std::string("asdf")); return 0; } produces the following error on line 17 (the line that calls foo() ) when compiled with clang: main.cpp:17:23: error: no matching