实战c++中的vector系列
本专栏主要记录和讲诉实际工作中,关于vector的一些操作,一些tips和一些tricks.
一苇渡江694
无有功德,一苇渡江
展开
-
实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)
之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中,vector A中的结果我们可想而知,但是vector B中的元素还会如何?看看之前写过的程序:#include <iostream>#include <vector>int main (){ std::vector<int> myvector (3,100); std::vector原创 2015-12-24 21:33:55 · 7495 阅读 · 1 评论 -
实战c++中的vector系列--对vector<自定义类>使用std::find 和 std::find_if 算法
之前博客讲了一些关于std::find和std::find_ if的一些用法,但是没有讲述对于vector中存储的是自定义的类,那么怎么样使用std::find和std::find_if进行查找呢?先定义一个类:class Item{private: std::string m_ItemId; int m_Price; int m_Count;public:原创 2015-12-23 21:19:12 · 28224 阅读 · 2 评论 -
实战c++中的vector系列--使用sort算法对vector<unique_ptr<string>>进行排序(sort函数“应输入 2 个参数,却提供了 3 个)
之前博客写了对vector使用sort算法进行的排序,之前也写到过vector<unique_ptr<string>>的一些处理方法。今天就写一下对vector<unique_ptr<string>>使用sort算法进行排序。#include<iostream>#include<string>#include<vector>#include<algorithm>#include<memory原创 2015-12-23 20:16:10 · 4685 阅读 · 2 评论 -
实战c++中的vector系列--vector应用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)
使用vector容器,即避免不了进行查找,所以今天就罗列一些stl的find算法应用于vector中。find() Returns an iterator to the first element in the range [first,last) that compares equal to val. If no such element is found, the function retur原创 2015-12-22 23:33:44 · 12306 阅读 · 2 评论 -
实战c++中的vector系列--使用sort算法对vector进行排序(对vector<string>排序、使用稳定的排序std::stable_sort())
写了挺多关于vector的操作了,正好工作中遇到对vector进行排序的问题,这里就讨论一下。直接使用sort算法,那就先了解一下:template <class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last);template <class RandomAccess原创 2015-12-22 21:13:30 · 16440 阅读 · 4 评论 -
实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中判断不等于end())、operator[])
遍历一个vector容器有很多种方法,使用起来也是仁者见仁。通过索引遍历:for (i = 0; i<v.size(); i++){ cout << v[i] << " ";}迭代器遍历:for (vInt::const_iterator iter = v.begin(); iter != v.end();iter++){ cout << *iter << " ";}算法遍历原创 2015-12-21 22:01:56 · 26096 阅读 · 2 评论 -
实战c++中的vector系列--vector的一些异常
今天就写一写vector的一些异常,可以捕捉的异常。out_of_range 相当于数组的越界了。vector会自动增大容量,但是如果索引超出了当前的size,就会引发异常。#include<iostream>#include<vector>using namespace std;int main(){ vector<int>v(4); std::cout << v[0]原创 2015-12-21 20:43:56 · 14180 阅读 · 0 评论 -
实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit())
关于vector已经写的差不多了,似乎要接近尾声了,从初始化到如何添加元素再到copy元素都有所涉及,是时候谈一谈内存的释放了。是的,对于数据量很小的vector,完全没必要自己进行主动的释放,因为那样对程序的效率几乎没有影响。但是当vector中存入大量的数据后,并且都数据进行了一些操作,比如删除后,如果我们能积极主动的去释放内存,那么是非常明智的。写到这里,应该明确了size和capacity的原创 2015-12-19 21:18:19 · 70549 阅读 · 11 评论 -
实战c++中的vector系列--C++11对vector成员函数的扩展(cbegin()、cend()、crbegin()、crend()、emplace()、data())
前面提到的emplace_back就是C++11所增加的内容。所以这篇博客就是想罗列一下C++11对vector容器的扩充。std::vector::cbegin和std::vector::cend 这两个方法是与std::vector::begin和std::vector::end相对应的,从字面就能看出来,多了一个’c’,顾名思义就是const的意思。 所以: std::vector::c原创 2015-12-19 18:07:00 · 8598 阅读 · 0 评论 -
实战c++中的vector系列--emplace_back造成的引用失效
上篇将了对于struct或是class为何emplace_back要优越于push_back,但是还有一些细节没有提及。今天就谈一谈emplace_back造成的引用失效。直接撸代码了:#include <vector>#include <string>#include <iostream>using namespace std;int main(){ vector<int> ive原创 2015-12-19 13:32:22 · 8568 阅读 · 3 评论 -
实战c++中的vector系列--知道emplace_back为何优于push_back吗?
上一篇博客说道vector中放入struct,我们先构造一个struct对象,再push_back。那段代码中,之所以不能使用emplace_back,就是因为我们定义的struct没有显示的构造函数。emplace和解? 放列的意思。这次我们不把struct当做vector的元素了,我们把一个class当做vector的元素,写下代码:#include <iostream>#include <原创 2015-12-19 10:51:50 · 46940 阅读 · 2 评论 -
实战c++中的vector系列--creating vector of local structure、vector of structs initialization
之前一直没有使用过vector<struct>,现在就写一个简短的代码: #include <vector>#include <iostream>int main() { struct st { int a; }; std::vector<st> v; v.resize(4); for (std::vector<st>::size_type i = 0; i <原创 2015-12-19 00:52:38 · 3731 阅读 · 1 评论 -
实战c++中的vector系列--vector<unique_ptr<>>赋值给vector<unique_ptr<>>
之前博客讲到 vector可以使用insert方法,将一个vector copy到另一个vector的后面。之前的博客也讲到过,如果vector容器内部放的是unique_ptr是需要进行所有权转移的。现在就来八一八如何vector<unique_ptr<>> insert to vector<unique_ptr<>>如果常规的vector,我们就可以这么使用insert:// insertin原创 2015-12-17 23:05:25 · 9539 阅读 · 1 评论 -
实战c++中的vector系列--vector<unique_ptr<>>作为函数的参数
现在就讨论一下,把vector作为函数的参数进行传递。 也是直接上一段代码:#include<iostream>#include<vector>#include <memory>using namespace std;void display_vector(vector<unique_ptr<int>> vec);int main(){ vector<unique_ptr<in原创 2015-12-17 21:20:13 · 6130 阅读 · 0 评论 -
实战c++中的vector系列--vector<unique_ptr<>>初始化(所有权转移)
C++11为我们提供了智能指针,给我们带来了很多便利的地方。那么如果把unique_ptr作为vector容器的元素呢?形式如出一辙:vector<unique_ptr<int> > vec;但是怎么给vec添加元素呢?看下面:#include<iostream>#include<vector>#include <memory>using namespace std;int main(){原创 2015-12-17 21:05:18 · 9762 阅读 · 0 评论 -
实战c++中的vector系列--可怕的迭代器失效之二(删除vector中元素)
有了上一篇博客《实战c++中的vector系列–可怕的迭代器失效(vector重新申请内存)》的基础,这里的内容就显得简单了。直接撸代码:#include<iostream>#include<vector>using namespace std;int main(){ vector<int> v; v.push_back(1); v.push_back(2);原创 2015-12-16 23:23:37 · 8768 阅读 · 2 评论 -
实战c++中的vector系列--可怕的迭代器失效(vector重新申请内存)
vector给我们提供了很多的方便,但是偶尔也会有陷阱。当不注意的时候,就掉入其中。说到底,还是对vector的机制不够彻底掌握。很轻松的写下这段代码:#include<iostream>#include<vector>using namespace std;int main(){ vector<int> v; v.push_back(1); std::vector<i原创 2015-12-16 23:05:33 · 7734 阅读 · 3 评论 -
实战c++中的vector系列--使用vector构造二维数组
二维数组有时候被用到,但是很少有人会使用vector来构造一个二维数组。首先,需要明确的是,在计算机的世界中,根本不存在二维数组,只是使用者的一个概念罢了。其实我们所谓的二维数组也必须是一段连续的内存。很多情况下,我们可以把常规的二维数组用一个vector表示,只要索引对应即可。那么,我若一意孤行呢,我就想vector里面放一个vector呢?#include <iostream> #incl原创 2015-12-16 20:42:23 · 13892 阅读 · 0 评论 -
实战c++中的vector系列--copy set to vector(别混淆了reserve和resize)
stl算法中有个copy函数,我们可以轻松的写出这样的代码:#include <iostream>#include <algorithm>#include <vector>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ double darray[10]={1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,原创 2015-12-15 23:56:35 · 14186 阅读 · 1 评论 -
实战c++中的vector系列--assign() push_back() or insert()
之前博客《实战c++中的vector系列–构造、operator=和assign区别》写了关于assign()方法,其中有一条就是: replacing its current contents modifying its size accordingly 就是替换了vector中已经存在的元素。这里就不再说明assign了。push_back故名意思就是在vector末尾追加:void p原创 2015-12-15 21:51:26 · 8509 阅读 · 0 评论 -
实战c++中的vector系列--将迭代器转换为索引
stl的迭代器很方便 用于各种算法。但是一想到vector,我们总是把他当做数组,总喜欢使用下标索引,而不是迭代器。这里有个问题就是如何把迭代器转换为索引:#include <vector>typedef std::vector<char *> MYARRAY;// This does the trickinline const int iterator_to_index(MYARRAY &a,原创 2015-12-15 21:26:39 · 15979 阅读 · 2 评论 -
实战c++中的vector系列--构造、operator=和assign区别
vector也许是实际过程中使用最多的stl容器,看似简单,其实有很多技巧和陷阱。着重看一看vector的构造,暂时按照C++11:default (1) explicit vector (const allocator_type& alloc = allocator_type());fill (2) explicit vector (size_type n); vect原创 2015-12-15 20:48:13 · 6835 阅读 · 3 评论