Vector:
写vector时候碰到这样一段代码:
for(int j=0;j<v1.size();j++)
{
printf("%d %d",j,v1[j]);
printf("%d",v1.size());
if(v1[j]==4)
{
v1.insert(v1.begin(),5); //在访问元素之前插入元素,那么元素的顺序整体就后面移动一位,那么一直访问到的都是4
j++;
}
getchar();
}
Notice: 如果在遍历中需要插入删除元素,那么v1.size不能固定下来,否则会遗漏尾部的元素,在插入之后注意把迭代器或者索引向后移动一位,这样才会指向插入前那个元素的位置。在由迭代器加1指向下一个元素。
其实VECTOR本质上是一个可以容纳任何类型的动态数组。他用到了C++的动态数组,本质上是一个数组,存放在连续的区域,由此可以知道,中间插入或者删除会导致内存区域整块地移动,这样效率很低。所以Vector适合那些经常需要随机访问的类型,当让在末尾push_back,pop_back的速度是很快的,不会导致内存区域的整片移动。
// settest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<set>
#include<algorithm>
#include<iterator>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
/*set<int> myset;
myset.insert(10);
myset.insert(20);
myset.insert(30);
myset.insert(40);
set<int>::iterator it = myset.begin();
it=find(myset.begin(),myset.end(),30);
//it=myset.find(30);
//myset.insert(it,25);
//it=myset.erase(it);
//myset.erase(30);
//printf("%d\n",*it);*/
set<int> s1;
set<int> s2;
set<int> result;
set<int> diff;
for(int i=1;i<=9;i++)
{
if(i%2==0)
s2.insert(i);
else
s1.insert(i);
}
set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(result,result.begin())); //插入器
printf("%d\n",result.size());
set_difference(result.begin(),result.end(),s1.begin(),s1.end(),inserter(diff,diff.begin()));
printf("%d\n",diff.size());
printf("%d\n",result.size());
diff.clear();
set_intersection(result.begin(),result.end(),s1.begin(),s1.end(),inserter(diff,diff.begin()));
printf("%d\n",diff.size());
return 0;
}
Stack
栈的基本操作比较简单,push,pop,top,empty,size等函数。
empty() 堆栈为空则返回真 pop() 移除栈顶元素 push() 在栈顶增加元素 size() 返回栈中元素数目 top() 返回栈顶元素
Sample:
#include<stack.h>
int main()
{
stack<int> s;
int j = 10;
while(--j)
{
s.push(j);
}
while(!s.empty())
{
printf("%d\n",s.top());
s.pop();
}
getchar();
return 0;
}
队列
队列的操作和栈的操作差不多,都是类似的,多了一个back操作,队列front,栈的top操作。
back() 返回最后一个元素 empty() 如果队列空则返回真 front() 返回第一个元素 pop() 删除第一个元素 push() 在末尾加入一个元素 size() 返回队列中元素的个数
#include<queue.h>
int main()
{
queue<int> q;
q.push(1);
q.push(2);
printf("%d",q.front());
printf("%d",q.back());
while(!q.empty())
{
printf("%d\n",q.front());
q.pop();
}
getchar();
return 0;
}
列表
list,list和vector很像,但是不吃随机访问,没有[]运算符和at运算符
list可以push_back,push_front,insert元素,可以使用迭代器,也可以使用反向迭代器。还可以sort这个参数。指定sort参数
bool comp(const Student & s1,const Student & s2)
{
if(s1.score>s2.score) true means it's right
return true;
return false;
}
#include<list.h>
#include<string.h>
struct Student
{
char name[20];
double score;
};
bool comp(const Student & s1,const Student & s2)
{
if(s1.score>s2.score)
return true;
return false;
}
int main()
{
list<Student> li;
Student temp;
//temp.name="laichunbin";
strcpy(temp.name,"laichunbin");//constan char * 到 char * 需要strcpy来进行转换。赋值
temp.score=89.33;
li.push_back(temp);
//temp.name="testuser";
strcpy(temp.name,"testuser1");
temp.score=95.33;
li.push_front(temp);
strcpy(temp.name,"testuser2");
temp.score=85.3366;
li.push_front(temp);
strcpy(temp.name,"testuser2");
temp.score=86.3366;
li.push_front(temp);
// for(int i=0;i<list.size();i++)
// {
// printf("%s %lf\n",list[i].name,list[i].score);
// }
li.sort(comp);
list<Student>::iterator it = li.begin(); //可以是反向迭代器reverse_iterator rbegin,rend参数
for(;it!=li.end();it++)
{
printf("%s %lf\n",it->name,it->score); //用指针操作运算符,而不是.
}
getchar();
return 0;
}
优先队列<priority_queue>
#include<stdio.h>
#include<queue>
#include<string>
using namespace std;
struct node
{
int no;
string name;
bool operator<(const node & b) const //结构体,注意函数后面加上const来说明这是一个常函数,才可以编译通过
{
if(no<b.no)
return true;
else if(name>b.name)
return true;
return false;
}
};
int main()
{
//priority_queue<int,vector<int>,greater<int> > q1; 整数
priority_queue<node> q1;
// q1.push(3);
// q1.push(5);
// q1.push(4);
// q1.push(8);
// while(!q1.empty())
// {
// printf("%d\n",q1.top());
// q1.pop();
// }
node a;
a.no = 123;
a.name="lai";
q1.push(a);
a.no=124;
a.name="chun";
q1.push(a);
a.no=124;
a.name="bin";
q1.push(a);
while(!q1.empty())
{
node tmp=q1.top();
printf("%d %s\n",tmp.no,tmp.name.c_str());
q1.pop();
}
getchar();
return 0;
}
集合操作,集合的又声明,在声明时候可以传入比较函数,也可以在结构体中使用比较符号。;insert操作,find,erase操作,迭代,反向迭代。set_union,set_difference,set_intersection;这个几个函数在algorothm库里面的。
#include<stdio.h>
#include<set>
#include<algorithm>
using namespace std;
struct mycmp{
bool operator()(const int & a,const int &b)
{
if(a>b)
return true;
return false;
}
};
int main()
{
set<int,mycmp> s;
set<int>::iterator it;
pair<set<int>::iterator,bool> ret;
s.insert(8);
s.insert(9);
s.insert(5);
s.insert(19);
ret = s.insert(8);
if(ret.second==false)
printf("insert fail!");
s.insert(25);
it = s.begin();
for(;it!=s.end();it++)
printf("%d\n",*it);
it =s.find(8);
s.erase(it);
//sort(s.begin(),s.end());
for(it=s.begin();it!=s.end();it++)
printf("%d\n",*it);
getchar();
return 0;
} =========================
set<int> s1;
set<int> s2;
set<int> output;
set<int>::iterator it;
s1.insert(1);
s1.insert(3);
s2.insert(3);
s2.insert(4);
set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(output,output.begin()));
set_intersection()
set_difference();
set
for(it=output.begin();it!=output.end();it++)
printf("%d\n",*it);
来源:https://www.cnblogs.com/championlai/p/3938336.html