C++ STL

vector

如何彻底清空一个vector?

实践证明,vector.clear()并不能把vector容量清空,只会让vector.size()变为零,依然很占内存。那如何让vector的capacity变为0呢?

vector<int> nums(500);
nums.clear();
cout<<"size after clear:"<<nums.size()<<endl;
cout<<"capacity after clear:"<<nums.capacity()<<endl;
nums = vector<int>();
cout<<"capacity after from new vector:"<<nums.capacity()<<endl;

输出结果:

string

substr

s.substr(start, nums);    //从下标为start的元素开始,取nums个数。注意:nums表示所取字符个数,而不结尾字符的下标。
s.substr(start); //从下标为start的元素开始,取到s的结尾

列如,

string str="We think in generalities, but we live in details.";
string str2 = str.substr (3,5); // "think"
string str3 = str.substr (3); //think in generalities, but we live in details.
size_t pos = str.find("live"); // position of "live" in str
string str3 = str.substr (pos); // get from "live" to the end

set

set 用来为C++中的集合容器,但是是底层是用红黑树实现的,其迭代器不能加减常数。但是如何还想用set迭代器加减常数,可以使用vector模拟一个set。每次修改vector之后,需要使用del_dup函数除去重复元素。

void del_dup(vector<int> &vec) {
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
}

虽说set迭代器不能加减常数,但提供了.begin(),.end(),it++等操作,所以遍历集合set可以有以下两种方式:

方法一:auto for

    for (auto i : myset) {
cout<<i<<" ";
}

方法二:迭代器

    for (auto it = myset.begin(); it != myset.end(); it++) {
cout<<*it<<" ";
}

C++11新用法

哈希表

C++11中引用哈希表来加快查找内容的速度,但是名字不叫hash_map,而叫unordered_set与unordered_map,使用时,

#include <unordered_set>
#include <unordered_map>

unordered_set

unordered_set可以在常数时间查找表中的内容,当我们需要确定曾经是否访问过某个内容,使用unordered_set可以实现O(1)时间查找。比如图的遍历中,确定是否曾经访问过某个结点,可以一边遍历,一边构建hash表,一边查边,确保没有重复访问结点,具体实现参考2.4 图的层序遍历

unodered_map

unodered_map当我们需要建立某键值对{key, val}之间的关系,并且随后需要根据key快速查找value时,可以使用unordered_map。

创建方法

unordered_map<int, string> hash;

初始化

unordered_map<int, string> hash = {{1, "milk"},{2, "flour"}};

插入

hash.insert({3, "apple"});

查找

auto got = hash.find(1);
if (got != hash.end()) { //使用前最好先确定确实找到了键值对
cout<<got->first<<endl;
cout<<got->second<<endl;
}

输出

1
milk

当我们需要深度拷贝图,或者带随机指针的链表时,可以使用该方法。

遍历容器不同方法

C++引入了一种更简单的for语句, 这种语句可以更简洁遍历初始值列表、数组、容器、string等类型的对象,这些对象的公共特点是都有返回迭代器的begin与end成员。

主要形式,如下:

for (auto &element : vector) {
statement;
}

其中

  • auto用来确定容器中元素的类型,不仅可以用在for中,也可以用在其它位置用来确定定义的变量类型,如:auto it = vector.begin() 这样写可以比较简洁
  • 如果需要改写容器中元素内容比较在element前加引用型&

以下代码为遍历一个容器或者数组或者string的所有方式:

    int array[] = {2, 4, 6, 8};
vector<int> vec(array, array + 4);
string str = "I am good student"; cout<<endl<<"method1: iterator"<<endl;
for (vector<int>::iterator it = vec.begin(); it < vec.end(); ++it) {
cout<<*it<<" ";
} cout<<endl<<"method2: index"<<endl;
for (vector<int>::size_type id = 0; id < vec.size(); ++id) {
cout<<vec[id]<<" ";
} cout<<endl<<"method3: auto type"<<endl;
//sometimes, you need iterator traverse while simple code
for (auto it = vec.begin(); it < vec.end(); ++it) {
cout<<*it<<" ";
} cout<<endl<<"method4: auto for"<<endl;
//use & for writing element to vector
for (auto item : vec) {
cout<<item<<" ";
} cout<<endl<<"method5: auto for to traverse array"<<endl;
for (auto item : array) {
cout<<item<<" ";
}
cout<<endl;
for (auto item : {1, 3, 5, 7}) {
cout<<item<<" ";
} cout<<endl<<"method6: auto for to traverse string"<<endl;
for (auto c : str) {
cout<<c;
}

C++与python语言切换时的一些定式思维

二维数组的访问

python中二维数组中可以使用[row, col]的方式访问二维数组



但是C++中逗号表达式表示顺序执行所有表达式,并且将最后一个表达式的值返回。C++ A[i, j]其实表示的是A[j],只是一个指针而已,这会带来很大的误解。

C++实践积累的更多相关文章

  1. JS实战 · 实践积累点滴杂烩

    onmouseover : 鼠标进入 onmouseout : 鼠标离开 onfocus:得到焦点   表单提交执行JS代码,有两种常用方式. 一:在局部(比如按钮定义处)用onclick=" ...

  2. awk实践积累

    #cat iii |awk '{max=$2;min=$2;for (i=2;i<=NF;i++) if ($i>max) max=$i fi} {for (i=2;i<=NF;i+ ...

  3. eclipse常用快捷键实践积累

    1. [Ctrl + D]:删除一整行 2. 给函数添加注释 [选中函数名]-[Alt + Shift + J].如果需要自定义注释内容可通过[项目]-[属性]-[Java代码样式]-[代码模板]-[ ...

  4. 深度解析SDN——利益、战略、技术、实践(实战派专家力作,业内众多专家推荐)

    深度解析SDN——利益.战略.技术.实践(实战派专家力作,业内众多专家推荐) 张卫峰 编   ISBN 978-7-121-21821-7 2013年11月出版 定价:59.00元 232页 16开 ...

  5. T型知识实践结构的力量(转载)

    最近在做的一些新的事情,这其中获得的一些新的思考. T型的知识积累,深度的挖掘可以通过"举一反三"的应用在广度上,广度可以通过"交叉验证"加强我们的认识,可以说 ...

  6. 干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践

    1.题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的[樊登读书会].得到的每天听本书.XX拆书帮等. 目前市面上Elast ...

  7. 【转载】 Spark性能优化指南——基础篇

    转自:http://tech.meituan.com/spark-tuning-basic.html?from=timeline 前言 开发调优 调优概述 原则一:避免创建重复的RDD 原则二:尽可能 ...

  8. [转载]AxureRP学习成长之路

    [编者按]本文作者@朱军华Ronzhu , 本文借用官网的描述定义,介绍了在学习AxureRP过程当中所要经历的各个阶段,也结合了作者自身学习AxureRP使用的经验,讲一下在各个阶段中的一些学习方法 ...

  9. 【转】Spark性能优化指南——基础篇

    http://mp.weixin.qq.com/s?__biz=MjM5NDMwNjMzNA==&mid=2651805828&idx=1&sn=2f413828d1fdc6a ...

随机推荐

  1. IPC$入侵大全

    0x01  ipc$的定义 IPC$(Internet Process Connection)是共享"命名管道"的资源(大家都是这么说的),它是为了让进程间通信而开放的命名管道,可 ...

  2. bzoj4165: 矩阵(堆+hash)

    求第k大用堆维护最值并出堆的时候扩展的经典题... 因为只有正数,所以一个矩阵的权值肯定比它的任意子矩阵的权值大,那么一开始把所有满足条件的最小矩阵加进堆里,弹出的时候上下左右扩展一行加进堆,用has ...

  3. Codeforces Round #441 Div. 2题解

    比赛的时候E调了好久...F没时间写T T A:直接走到短的路上来回走就好了 #include<iostream> #include<cstring> #include< ...

  4. 用dtree实现树形菜单 dtree使用说明

    http://www.jb51.net/article/28566.htm 准备工作: 请从脚本之家http://www.jb51.net/jiaoben/31974.html下载dtree.zip文 ...

  5. ACE服务端编程5:ACE日志输出和跟踪

    服务器程序经常需要在命令行中显示错误消息.状态或者用来跟踪程序的执行路径,最简单的方法是使用printf. ACE提供了更强大日志设施: 1.可以在编译时启用或禁用宏: 2.可以动态的启用或禁用宏: ...

  6. NOIP模拟2

    期望得分:100+100+100=300 实际得分:70+40+20=130 T1 [SCOI2007]kshort弱化版 Description 有n个城市和m条单向道路,城市编号为1~n.每条道路 ...

  7. HDU 2582 规律 素因子

    定义$Gcd(n)=gcd(\binom{n}{1},\binom{n}{2}...\binom{n}{n-1})$,$f(n)=\sum_{i=3}^{n}{Gcd(i)}$,其中$(3<=n ...

  8. JAVA多线程基础学习一:基础知识

    我们知道多线程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 一.线程基本概念 1 线程:进程中负责程序执行的执行单元(执行 ...

  9. 用Matlab实现字符串分割(split)

    用Matlab实现字符串分割(split)Posted on 2011/08/08 Matlab的字符串处理没有C#强大,本身又没有提供OO特性,需要依赖别的手段完成这项任务. 我们在这里借助正则表达 ...

  10. laravel中form表单,ajax传值没反应

    laravel中form表单,ajax传值没反应时,可能是令牌有问题. form中添加: {{csrf_token()}} ajax中添加: data: {'page': page, '_token' ...