源地址 https://www.ev0l.art/index.php/archives/15/php
<li> Iterator (迭代器)
<li> Container (容器) array
<li> Alogrithm (算法)
<li> Adapters (配接器) 用来实现容器之间的转接
面向过程--》面向对象-》基于对象-》泛型css
#include <iostream>
#include <vector> //容器 #include <algorithm> //算法 using namespace std; //专么实现一个类模板,实现打印 //类模板实现了方法 template <class T> class vector_s { public: void operator()(const T &t1) //重载了小括号 实现访问小括号就直接打印 { cout << t1 << endl; } }; int main(void) { vector<int> myv; myv.push_back(13); myv.push_back(23); myv.push_back(33); myv.push_back(113); myv.push_back(1995); myv.push_back(1996); vector_s<int> print; // 对打印实现实例化 //myv.begin(), myv.end() 是迭代器 本质是指针 // for_each 本质是一个算法 for_each(myv.begin(), myv.end(), print); cin.get(); return 0; }
<li>注意:算法须要包含头文件 <algorithm>
<li>这个遍历的函数为 for_each 不是foreach
<li>算法能够适用于任何容器ios
-有些算法并不依赖于数据结构的特定实现,而只依赖于该结构的几个基本语义属性git
-STL 抽象出的这些基本属性(concept)成功的将算法和数据结构相分离,在没有效率损失的前提下,得到了极大的弹性!算法
-容器 (container)编程
-算法Algorithm数组
-迭代器 (iterator)数据结构
-仿函数 (Function Object)less
-适配器 (Adaptor)ide
-空间制配器 (allocator)
获取远程代码修改后,想要push到远端与原来不一样的新分支,可使用下面的命令实现:
git push origin 本地分支:远端但愿建立的分支
例如git下来的分支为master
git branch master
git push origin master:my_remote_new_branch
std::for_each(arr.begin(), arr.end(), func);
比较有用的for_each 用法
for (auto n:Original)
C++ 11 新的for
class MyClass typename T::SubType * ptr; //typename 直接指示 T::SubType * 为一个类型 没有typename 会被解析为 // T域中的 SubType 静态成员 乘于(*) ptr. ... };
-typename 的第二个做用:在模板声明中替换class -
template <typename T > class Myclass;
-每一个元素都有固定位置--去结余插入时机和地点,和元素值无关
-vector list deque
-元素取决于特定的排序准则,和插入顺序无关
-set multiset map multimap
array <int ,5>={1,2,3,4,5};
-静态数组,栈上
mv.push_back()
-不须要变长,容量较小,array 须要变长,容量较大,用vector
-list容器是无序容器
-list 容器只能经过迭代器访问。经过++ -- 遍历
-list容器可使用remove()方法删除元素,
-能够同时正向和反向查找
-可使用sort()函数排序
-可使用merge 合并,可是合并以前必须排序
-可使用unique()函数删除重复项,删除前必须排序。
-set容器不能有重复项,重复的会被舍弃
-set容器会自动排序
-set 用insert插入元素
-set能够用find()函数查找位置
循环加栈
find()函数能够查找数组、容器中的元素。
for_each(); 遍历每个元素。
multiset和set差很少,可是容许重复元素。
迭代器本质是智能指针。
auto ifind=find_if(mylist.bengin(),mylisy.end(),bindlst(greater<int>(),3));
bindlst 须要头文件 funtional #include <functional>
bindlst(greater<int>(),3);
绑定一个函数。 greater<int>()
是一个仿函数(functional) 是一个重载了()的类/结构 体 ,能够用来实现必定的算法策略。
仿函数例子:
#include <list>
#include <functional> #include <array> #include <algorithm> using namespace std; class shuchu { public: void operator()(int x) { std::cout<<x<<endl; } }; int main(int argc, char const *argv[]) { /* code */ // array<int,5>array1({1,2,3,4,5}); list <int>ls1; ls1.push_back(1); ls1.push_back(3); ls1.push_back(5); ls1.push_back(7); ls1.push_back(9); auto ib=ls1.begin(); auto ie=ls1.end(); for_each(ib,ie,shuchu()); cin.get(); return 0; }
-智能指针有一个_Ptr属性,能够打印里面的指针。
-STL 有bug 先访问迭代器的_Ptr属性,再访问迭代器指针正常,可是反过来会出错。
-分行打印就没有问题。
-用法
stack <mystack>; //声明一个栈
mystack.push(num); //压栈
mystack.pop(); //出栈
mystack.top(); //获取第一个元素
stack成员函数示例
-size( ) :返回栈中元素个数
-top( ) :返回栈顶的元素
-pop( ) :从栈中取出并删除元素
-push(e) :向栈中添加元素e
-empty( ) :栈为空时返回true
-queue 英 [kjuː] 美 [kjuː]
n.(人、汽车等的)队,行列;(储存的数据)队列
v.(人、车等)排队等候;(使)排队;列队等待
-queue 须要头文件 <queue>
-从网上拔来的Queue
<h2>queue 操做</h2>
queue 和 stack 有一些成员函数类似,但在一些状况下,工做方式有些不一样:
queue<T> 模板定义了拷贝和移动版的 operator=(),对于所保存元素类型相同的 queue 对象,它们有一整套的比较运算符,这些运算符的工做方式和 stack 容器相同。
(1) 构造函数
deque():建立一个空deque
deque(int nSize):建立一个deque,元素个数为nSize
deque(int nSize,const T& t):建立一个deque,元素个数为nSize,且值均为t
deque(const deque &):复制构造函数
(2) 增长函数
void push_front(const T& x):双端队列头部增长一个元素X
void push_back(const T& x):双端队列尾部增长一个元素x
iterator insert(iterator it,const T& x):双端队列中某一元素前增长一个元素x
void insert(iterator it,int n,const T& x):双端队列中某一元素前增长n个相同的元素x
void insert(iterator it,const_iterator first,const_iteratorlast):双端队列中某一元素前插入另外一个相同类型向量的[forst,last)间的数据
(3) 删除函数
Iterator erase(iterator it):删除双端队列中的某一个元素
Iterator erase(iterator first,iterator last):删除双端队列中[first,last)中的元素
void pop_front():删除双端队列中最前一个元素
void pop_back():删除双端队列中最后一个元素
void clear():清空双端队列中最后一个元素
(4) 遍历函数
reference at(int pos):返回pos位置元素的引用
reference front():返回手元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元素
iterator end():返回指向向量中最后一个元素下一个元素的指针(不包含在向量中)
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素的前一个元素
(5) 判断函数
bool empty() const:向量是否为空,若true,则向量中无元素
(6) 大小函数
Int size() const:返回向量中元素的个数
int max_size() const:返回最大可容许的双端对了元素数量值
(7) 其余函数
void swap(deque&):交换两个同类型向量的数据
void assign(int n,const T& x):向量中第n个元素的值设置为x
deque网上扒来的
#include <set> #include <string> #include <stdio.h> #include <string.h> using namespace std; class strless { public: bool operator () (const char* p,const char* p1) { return strcmp(p, p1) < 0; } private: }; int main(void) { const char* cmd[] = { "nihao","spectrc","calc","good" }; set<const char *, strless>myset(cmd,cmd+4,strless()); auto ib = myset.begin(); auto ie = myset.end(); for (auto i : myset) { cout << i << endl; } return 0; }
#include <set> #include <string.h> using namespace std; class stu{ public: int id; char p[100]; }; class stuless { public: bool operator ()(const stu &st1,const stu &st2) { return st1.id<st2.id; } }; int main() { stu student[3]={ {99,"zhuang"}, {15,"li"}, {3,"ooooo"} }; stu newstu; newstu.id=100782; strcpy(newstu.p,"nimeide"); multiset<stu,stuless> stu1 (student,student+3,stuless()); stu1.insert(newstu); strcpy(newstu.p,"SBSBSBSB"); stu1.insert(newstu); strcpy(newstu.p,"luo liuo"); stu1.insert(newstu); for(auto i:stu1) { cout<< "\t"<<i.id<<"\t"<<i.p<<endl; } return 0; }
-
#include <string> #include <map> #include <stdlib.h> using namespace std; class worker{ public: int id; string name; string work; }; class winfo{ public: int randid; worker w1; }; int main() { system("chcp 65001"); winfo warr[]={ {1,{10,"李四","mugong"}}, {2,{9,"张三","mugong"}}, {8,{5,"wangermazi","mugong"}}, {20,{3,"gg","mugong"}}, {30,{1,"ww张三","mugong"}} }; map <int,worker> m; for(auto i : warr) { static int n=0; m[warr[n].randid]=warr[n].w1; n++; } auto ib=m.begin(); auto ie=m.end(); for(;ib!=ie;ib++) { cout<<"\t winfo.randid is \t"<<(*ib).first<<" worker info is \t"<<(*ib).second.id<<"\t"<<(*ib).second.name <<"\t"<<(*ib).second.work<<"\t"<<endl; } return 0; }
m.insert(pair<const char*,int> ("第一个"),1); m.insert(pair<const char*,int> ("第二个"),2); m.insert(pair<const char*,int> ("第三个"),5); m.insert(pair<const char*,int> ("第四个"),8);
char str[54];
str="123456";
auto func=[](int a ,int b){ return a+b;}; for_each(myvector.begin(),myvector.end(),[](int a){return a*=2;cout<<a<<endl;});
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C3861 “_Access”: 找不到标识符 GPU_hello c:\program files (x86)\microsoft visual studio\2017\enterprise\vc\tools\msvc\14.15.26726\include\amp.h 2616 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C3588 在 amp 限制代码中不支持从“unknown-type”转换为“void *” GPU_hello c:\program files (x86)\microsoft visual studio\2017\enterprise\vc\tools\msvc\14.15.26726\include\amp.h 2616
#include <amp.h>
#include <iostream>
using namespace std; using namespace concurrency; int main(void) { int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; array_view<int> av(10, a); //GPU 计算结构 AV 存储到GPU的显存 /* *[=](index<1>idx) restrict (amp) {av[idx] *= 2; } * [=] 标识直接操做这个数据 * restrict (amp) 标识定位到 GPU进行运算 *这个表达式为Lambda表达式 */ parallel_for_each(av.extent, [=](index<1> idx) restrict (amp) {av[idx] *= 2; }); for (int i = 0; i < 10; i++) { cout << "\t" << av[i] << endl; } cin.get(); }
Lambda 表达式
-lambda 表达式的做用:C++ 11 中的 Lambda 表达式用于定义并建立匿名的函数对象,以简化编程工做。