stl

【STL记录】Containers--Deques

雨燕双飞 提交于 2019-12-27 18:06:01
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Deque和vector很像,区别是deque可以在两头插入和删除。 要使用deque,需加上头文件: #include <deque> 一、Abilities of Deque 1.deque与vector的不同之处 在头尾插入和移除元素都很快 访问元素的内部结构更加间接,因此访问和移动稍慢 Iterator必需是smart pointer而不是ordinary pointer,因为要在不同blocks之间跳 deque能包含更多的元素,所以max_size()更大一些 Deques不提供控制capacity和再分配的支持 当不在使用时,内存空间将释放 所以,当满足一下条件时,使用deque: 在两端插入和移除元素 不指向Container的元素 重要的一点是当不再使用时container会释放内存(并不能保证一定会发生) 2.Constructors and Destructor Operation Effect deque<Elem> c Default constructor:创建一个空的deque deque<Elem> c(c2) Copy constructor:通过复制c2创建c deque<Elem> c = c2 Copy constructor:通过复制c2创建c deque<Elem>

C++ valarray vs. vector

三世轮回 提交于 2019-12-27 16:32:45
问题 I like vectors a lot. They're nifty and fast. But I know this thing called a valarray exists. Why would I use a valarray instead of a vector? I know valarrays have some syntactic sugar, but other than that, when are they useful? 回答1: Valarrays (value arrays) are intended to bring some of the speed of Fortran to C++. You wouldn't make a valarray of pointers so the compiler can make assumptions about the code and optimise it better. (The main reason that Fortran is so fast is that there is no

STL vector

Deadly 提交于 2019-12-27 10:51:55
STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问元素,还可以使用指针的偏移方式访问,和常规数组不一样的是,vector能够自动存储元素,可以自动增长或缩小存储空间。 成员函数表 函数 表述 c.assign(beg,end) 将[beg; end)区间中的数据赋值给c c.assign(n,elem) 将n个elem的拷贝赋值给c c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range c.back() 传回最后一个数据,不检查这个数据是否存在 c.begin() 传回迭代器重的可一个数据 c.capacity() 返回容器中数据个数 c.clear() 移除容器中所有数据 c.empty() 判断容器是否为空 c.end() 指向迭代器中的最后一个数据地址 c.erase(pos) 删除pos位置的数据,传回下一个数据的位置 c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置 c.front() 传回第一个数据 get_allocator 使用构造函数返回一个拷贝 c.insert(pos,elem) 在pos位置插入一个elem拷贝,传回新数据位置 c

C++ STL之set的使用

喜欢而已 提交于 2019-12-27 04:06:12
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。 平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。 构造set集合主要目的是为了快速检索,不可直接去修改键值。 常用操作: 1.元素插入:insert() 2.中序遍历:类似vector遍历(用迭代器) 3.反向遍历:利用反向迭代器reverse_iterator。 例: set<int> s; ...... set<int>::reverse_iterator rit; for(rit=s.rbegin();rit!=s.rend();rit++) 4.元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。 set<int> s; s.erase(2); //删除键值为2的元素 s.clear(); 5.元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。 set<int> s; set<int>::iterator it; it=s.find(5); //查找键值为5的元素 if(it!=s.end()) /

STL : 反向迭代器(Reverse Iterator)

女生的网名这么多〃 提交于 2019-12-27 04:04:32
1. 定义 反向迭代器(Reverse Iterator)是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++运算将访问前一个元素,而--运算则访问下一个元素。 2. 作用 (1)反向迭代器需要使用自减操作符:标准容器上的迭代器(reverse_iterator)既支持自增运算,也支持自减运算。但是,流迭代器由于不能反向遍历流,因此流迭代器不能创建反向迭代器。 (2)可以通过reverse_iterator::base()将反向迭代器转换为普通迭代器使用,从逆序得到普通次序。这是因为:有些容器的成员函数只接受iterator类型的参数,所以如果你想要在ri所指的位置插入一个新元素,你不能直接这么做,因为vector的insert函数不接受reverse_iterator。如果你想要删除ri 所指位置上的元素也会有同样的问题。erase成员函数会拒绝reverse_iterator,坚持要求iterator。为了完成删除和一些形式的插入操作,你必须先通过base函数将reverse_iterator转换成iterator,然后用iterator来完成工作。 3. 例子 1 void test_reverse() 2 { 3 int a[] = {-2, -1, 0, 1, 2, 3, 4}; 4 std

STL中vector,Map,Set的实现原理

一曲冷凌霜 提交于 2019-12-25 22:43:19
Map Map是关联容器,以键值对的形式进行存储,方便进行查找,关键词起到索引的作用,值则表示与索引相关联的数据,以红黑树的结构实现,插入删除等操作都可以在O(log n)时间内完成。 Set Set是关联容器,set中每个元素都只包含一个关键字,set支持高效的关键字查询操作—检查每一个给定的关键字是否在set中,set是以红黑树的平衡二叉检索树结构实现的,支持高效插入删除,插如元素的时候会自动调整二叉树的结构,使得每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值,另外还得保证左子树和右子树的高度相等。 平衡二叉检索树使用中序遍历算法,检索效率高于vector,deque,list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。 构造set集合的主要目的是为了快速检索,不可直接去修改键值 来源: CSDN 作者: 图灵图灵 链接: https://blog.csdn.net/qq_33904512/article/details/103706016

【STL队列和栈】HDU-1702 ACboy needs your help again!

半腔热情 提交于 2019-12-25 20:02:50
注解 1、熟练使用STL中的栈和队列。 代码 # include <iostream> # include <queue> # include <stack> using namespace std ; int main ( ) { int T ; cin >> T ; for ( int i = 0 ; i < T ; i ++ ) { int n ; cin >> n ; string s ; cin >> s ; if ( s . compare ( "FILO" ) ) { queue < int > q ; for ( int j = 0 ; j < n ; j ++ ) { string str ; cin >> str ; if ( str . compare ( "IN" ) ) { if ( q . size ( ) > 0 ) { int ans = q . front ( ) ; q . pop ( ) ; cout << ans << endl ; } else { cout << "None" << endl ; } } else { int tmp ; cin >> tmp ; q . push ( tmp ) ; } } } else { stack < int > st ; for ( int j = 0 ; j < n ; j ++ ) {

Why sort() function causes compilation error when it is used for set of class objects

不羁的心 提交于 2019-12-25 19:53:10
问题 I tried to overload < operator for class and called the function as follows: bool Edge::operator<(Edge const & e) const { return this->GetCost() < e.GetCost(); } in main() sort(edge_set.begin(),edge_set.end()); In addition, I also tried to write a simple comparator function for the objects, defined in main.cpp and tried to invoke sort() , however failed again: bool edge_comparator(Edge& e1, Edge& e2){ return (e1.GetCost() < e2.GetCost()); } in main() sort(edge_set.begin(),edge_set.end(), edge

c++ stl deque容器

不想你离开。 提交于 2019-12-25 15:30:01
c++中,Deque容器和vector相似,deque内部也采用动态数组来管理元素,支持随机存取。。头文件<deque> 1.deque和vector的不同之处: 1)两端都可以较快速地按插元素和删除元素,而vector只能在尾端进行 2)在对内存有所限制的系统中,deque可以包含更多的元素,因为它不止一块内存。因此deque的max_size()可能更大 3)deque不支持对容量和内存的重分配时机的控制。 4)deque的内存区块不再被使用时,会被释放。deque的内存大小是可缩减的,由实作版本定义。 2.和vecotr差不多的特性: 1)在中端部分按插、移除元素的速度相对较慢。 2)迭代器属于random access iterator(随机存取迭代器) 3.deque的常用函数: 1)构造函数 deque<T> c deque<T> c(n) 产生一个deque,含有n个元素,这些元素均以default构造函数产生 deque<T> c(n,elem) 产生一个含有n个值都是elem的deque deque<T> c(c2) c2中的所有元素都被拷贝来初始化c deque<T> c(beg,end) 以[beg,end]内的元素为初值 2)非变动性操作: c.size()   实际元素个数 c.empty()   判空 c.max_size() 

Stxxl map with std::string as key and std::vector as value

旧巷老猫 提交于 2019-12-25 14:13:08
问题 I need a large map of sets of numbers. So i'm using stxxl and it's basically something like map<std::string, std::vector<int>> . The key is 3-letters identifier. There are about 3k enteries in the map, and each of them can contain up to 500K numbers. It is important to use vector in the value since i need to change it (add/remove numbers). The problem is that after i insert all my data, when i try to access an element in the map, the vector is currupted. #define MAX_STRING_IN_MAP ("ZZZZZZZ")