begin

stl

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-15 23:40:02
容器 vector 特点:动态数组 元素类型相同 只能从尾部快速插入或者删除 随机访问快 中间插入删除慢(需要移动) capcity是给的块的大小 定义vector vector<int> A(10, 1); //声明一个初始大小为10且值都是1的向量 vector<int> A(tmp); //声明并用tmp向量初始化vec向量 vector<int> tmp(A.begin(), A.begin() + 3); //用向量vec的第0个到第2个值初始化tmp int arr[5] = {1, 2, 3, 4, 5}; vector<int> A(arr, arr + 5); //将arr数组的元素用于初始化A向量 //说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素, //这个主要是为了和vec.end()指针统一 vector<int> A(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为A的初始值 vector操作 向量大小: A.size(); 向量最大容量: A.max_size();与机器有关 与程序无关 更改向量大小: A.resize(n); n是新的大小 例证capacity、resize、shrink to fit 的关系 vector<int> myvector(100);#myvector

905. 按奇偶排序数组

北慕城南 提交于 2020-01-15 01:36:07
905. 按奇偶排序数组 1.题目描述 给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。你可以返回满足此条件的任何数组作为答案。 示例: 2.思路 维护两个指针,第一个指针指向数组的第一个数字,第二个指针指向最后一个数字,如果第一个指针指向的数字是奇数,第二个指针指向的数字是偶数则交换这两个数字。 3.代码 class Solution { public : vector < int > sortArrayByParity ( vector < int > & A ) { vector < int > res ; if ( A . empty ( ) ) { return res ; } int begin = 0 ; int end = A . size ( ) - 1 ; while ( begin < end ) { while ( begin < end && ( A [ begin ] & 1 ) == 0 ) { //直到遇到奇数 begin ++ ; } while ( begin < end && ( A [ end ] & 1 ) == 1 ) { //直到遇到偶数 end -- ; } if ( begin < end ) { swap ( A [ begin ] , A [ end ] ) ; } } return

MergeSort(归并排序)原理及C++代码实现

房东的猫 提交于 2020-01-14 19:39:11
归并排序利用分治策略进行排序。原理如下 分解:分解待排的n个元素的序列成个具n/2个元素的两个子序列。 解决:使用归并排序递归地排序两个子序列。 合并:合并两个已排序的子序列以产生已排序的答案。 归并排序的时间复杂度是θ(nlgn)。 归并排序是稳定排序之一。 归并排序不是原址排序,在合并阶段需要申请额外的数组空间。 代码如下: 1 void MergeSort(int * const begin, int * const end) { 2 if (begin + 1 >= end) 3 return ; 4 int m = (end - begin) / 2; 5 MergeSort(begin, begin + m); 6 MergeSort(begin + m, end); 7 Merge(begin, begin + m, end); 8 } 1 //不使用哨兵的版本,需判断边界条件 2 void Merge(int * const first, int * const mid, int * const last) { 3 vector<int> left(first, mid); 4 vector<int> right(mid, last); 5 6 int i = 0, j = 0, k = 0; 7 while (i != left.size() && j !=

几个经典的递归问题

流过昼夜 提交于 2020-01-12 20:29:10
以下内容来自维基百科: 递归 (英语: Recursion ),又译为 递回 ,在 数学与计算机科学 中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。 维基百科的几个例子有助于理解递归 : 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’” 一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:“一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:‘一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到……’” 大雄在房里,用时光电视看着未来的情况。电视画面中的那个时候,他正在用时光电视,看着未来的情况。电视画面中的电视画面的那个时候,他正在用时光电视,看着未来的情况……

Standard C++ Episode 11

こ雲淡風輕ζ 提交于 2020-01-12 07:11:23
一、标准模板库(STL) (p.s. STL中的常用实用工具 auto_ptr string pair ) 1.定义了一系列的容器模板(类模板),实现泛型化的数据结构。 1)向量(vector, 这里说的"向量"就是数组), 向量内存连续,支持下标访问和随机迭代,只有在尾部进行插入和删除效率才比较高。 2)列表(list),内存不连续,不支持下标访问和随机迭代,在任何位置进行插入和删除效率都很高。 3)双端队列(deque),内存连续,支持下标访问和随机迭代,在首尾两端进行插入和删除效率都比较高。 以上三种合称为线性容器。 4)堆栈(stack),后进先出 5)队列(queue),先进先出 6)优先队列(priority_queue),优者先出 以上三种合称为适配器容器,通过某种线性容器适配。 7)映射(map),是键值对(KVP)的集合,按键升序,键唯一。 采用了有序二叉树(二叉搜索树)数据结构实现。 8)集合(set),没有值只有键的映射, 按键升序。 9)多重映射(multimap),允许重复键的映射,即键不唯一。按键升序。 10)多重集合(multiset),没有值只有键的多重映射。按键升序。 以上四种合称为关联容器。通过有序树表达数据的关联性。按键升序。 2.泛型函数(函数模板) template<typename T> void swap (T& a, T& b) {

读书备忘录--C++标准库

不羁的心 提交于 2020-01-11 23:19:48
顺序容器 vector 类似数组,连续存储。适合随机访问,尾部插入。 list 双向链表,内存可以不连续。适合任意位置的删除和插入。 deque 支持在两端的操作push_back,push_front,pop_back,pop_front等 常用操作 1.添加元素 c.push_back(t) 向后添加元素 c.push_front(t) 向前添加元素 只适用list和deque c.insert(p,t) 迭代器p前添加元素 2.访问元素 c.back() 最后一个元素 c.front() 第一个元素 *p 迭代器p指向的元素 c[i] 第i+1个元素 只适用与vector和deque 3.删除元素 c.erase(p) 删除p指向元素 c.clear() 删除所有元素 c.pop_back() 删除最后一个元素 c.pop_front() 删除第一个元素 只适合list和deque 4.交换元素 c1.swap(c2) 5.元素个数 m.empty() 检验是否空 m.size() 元素个数 常用函数 计数 count_if(c.begin(),c.end(),fun) 查找 find(c.begin(),c.end(),x) 排序 sort(c.begin(),c.end()) 适用vector,deque stable_sort(c.begin(),c.end())

c++ 实现向量去重操作

本小妞迷上赌 提交于 2020-01-11 17:03:47
去重的时候要考虑线性表或链表是否是有序 1.1.无序线性表 对于向量[1,5,3,7,2,4,7,3], 从头开始扫描vector内的元素, 对于表中r处的元素a[r], 检查数组0至r-1区间内是否存在与a[r]重复的元素, 如果存在就删除,否则r++ void deduplicate(vector<int> a){ int len = a.size(), r = 0; vector<int>::itrator it; while(++r < len){ # find the duplicate before a[r] it = find(a.begin(), a.begin()+r, a[r]); # remove the duplicate if it is found if(it!=a.begin()+r) a.erase(it); } } 1.2.有序线性表 以重复区间为单位批量删除. 对于向量[2,2,2,3,3,3,6,6,6,6,9,9],设两个指针i, j, 初始时 i 指向第一个元素, j 指向紧邻i 的第二个元素, 如果a[i]=a[j], 则直接跳过(++j), 否则令i指向j所对应的元素, 然后++j vector<int> deduplicate(vector<int> a){ int i=0, j = 0; int len = a.size(); #

STL 常用方法

我是研究僧i 提交于 2020-01-11 08:43:27
1. 选择 C++ 刷算法的理由 1、C++ 速度快(C 不是更快吗,Java 太慢了) 2、C++ 有 STL(什么是 STL)——性能强大,使用方便的标准库 3、如何使用 STL 进行高效刷算法 4、好处:刷算法,学习成本低 5、如何从 C 到 C++(仅基础语法到刷算法程度) 俗话说:磨刀不误砍柴工,不会 C++ 仍然可以刷算法,但是效率相对很低。在 ACM 或各类程序算法竞赛中相比于 Java 代码的冗长,C 的繁琐,Python 的性能低下,C++ 以兼顾简洁和高效脱颖而出。 2.输入输出 C++ 保留了 C 的 scanf 和 printf,额外增加了 cin 和 cout。 Example: 2.1 C 程序中的输入输出 int a; scanf("%d", &a); printf("%d", a); 2.2 C++ 程序中的输入输出 int a; cin >> a; cout << a; 2.3 C++ 程序中的连续输入输出 int a, b, c; cin >> a >> b >> c; cout << a << b << c; 2.4 C++ 优雅地换行 cout << 1; cout << endl; cout << 2; cout << 3 << endl << endl; Notice: cin、cout 使用虽然很方便,但是比 scanf、printf

vector简介

人走茶凉 提交于 2020-01-11 01:46:36
删除a向量的最后一个元素 a.pop_back() 在a的最后一个向量后插入一个元素 a.push_back() vector中下标只能用于获取已存在的元素。 a.insert(a.begin()+1, 5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4 a.insert(a.begin()+1, 3, 5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5 a.insert(a.begin()+1, b+3, b+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8 # include <vector> //访问vector的集中方式 // 1. 向向量a中添加元素 vector < int > a ; for ( int i = 0 ; i < 10 ; i ++ ) { a . push_back ( i ) ; } // 2. 从数组中选择元素向向量中添加 int a [ 6 ] = { 1 , 2 , 3 , 4 , 5 , 6 } ; vector < int > b ; for ( int i = 0 ; i <= 4 ; i ++ ) { b .

给rar文件加个自定义头

▼魔方 西西 提交于 2020-01-09 11:21:38
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) btn1: TButton; btn2: TButton; edt2: TEdit; lbl1: TLabel; dlgOpen1: TOpenDialog; procedure btn1Click(Sender: TObject); procedure btn2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btn1Click(Sender: TObject); var i:Integer; sFile:string; ms:TMemoryStream; buf:string; begin ms:= TMemoryStream.Create; try if dlgOpen1.Execute then begin sfile:=