今天全都 比较 会了 2333
vector动态数组
头文件为vector 构造方式为 vector< ll(类型) > vec(变量名)
主要操作代码如下:
int main(){
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
for(register int i=0;i<vec.size();i++)
printf("%d ",vec[i]);
cout<<endl;
for(vector< ll >::iterator i=vec.begin();i!=vec.end();i++)
printf("%d ",*i);
cout<<endl;
vec[4] = 4;
vec[10] = 10;
vec[1] = 1;
for(register int i=0;i<vec.size();i++)
cout<<vec[i]<<" ";
cout<<endl;
cout<<vec[4]<<" "<<vec[10]<<" "<<vec[1]<<endl;
vec.clear();
cout<<"size:"<<vec.size()endl;
cout<<"但是元素还在不信你看"<<vec[0]<<" "<<vec[4]<<" ";
}
首先是插入元素 我们可以用第2行的push_back(x)在动态数组末尾插入一个元素 也可以像第13行一样直接搞 然后遍历方式有两种 第一个for循环是朴素的直接遍历 第二个是迭代器 问了一下清华大学的学长 按理说应该第二个快
下面问题来了 第三个循环输出的数只有三个 直接定义的vec[4 10]没有输出 因为vec.size()的大小只跟push_back的数量有关
另一个问题 vec.clear()可以清空动态数组 但实际上只是把vec.size()清0了 之前的元素都还保留
set集合
头文件为set 构造方式为 set< string(类型) > name(变量名)
主要操作代码如下:
int main(){
name.insert("crstiano.ronaldo");
name.insert("lionel.messi");
name.insert("alexis.sanchez");
name.insert("somebody");
name.erase("somebody");
if(name.count("somebody"))
cout<<"2333"<<endl;
if(name.count("crstiano.ronaldo"))
cout<<"CR7 is a great soccer player!"<<endl;
for(set< string >::iterator i=name.begin();i!=name.end();i++)
cout<<*i<<" ";
cout<<endl;
cout<<name.size()<<endl;
name.clear();
cout<<name.size()<<endl;
}
怎么往name这个集合里面添加东西呢?第一行的name.insert(sth)就可以做到 同理name.erase(sth)就是删除元素了 于是后面的遍历里面也没有somebody 然后就是name.count(sth) 类似于一个询问 如果集合里有这个元素就返回true 否则返回false 关于遍历也是使用迭代器 name.clear()与vector里面的同理
map映射
头文件为map 构造方式为 map< string(类型),string(类型) > team(变量名)
主要操作代码如下:
int main(){
team.insert(pair< string,string > ("henry","arsenal"));
team.insert(pair< string,string > ("aguero","manchester city"));
team.insert(pair< string,string > ("terry","chelsea"));
team.insert(pair< string,string > ("somebody","aclub"));
cout<<team["henry"]<<endl;
cout<<team["somebody"]<<endl;
team["somebody"] = "arsenal";
cout<<team["somebody"]<<endl;
if(team.count("me"))
cout<<"i am in the "<<team["me"]<<endl;
else cout<<"i am a free soccer player"<<endl;
cout<<team["me"]<<endl;
if(team.count("henry"))
cout<<"henry is in the "<<team["henry"]<<endl;
else cout<<"henry is a free soccer player"<<endl;
cout<<"line up:"<<endl;
for(map< string,string >::iterator i=team.begin();i!=team.end();i++)
cout<<i->first<<" is in the "<<i->second<<endl;
cout<<team.size()<<endl;
team.clear();
cout<<team.size()<<endl;
}
插入映射好像挺麻烦的 因为我们需要一个pair类型的结构 比如说第二行的team.insert(sth) henry和arsenal都是string的 我们可以理解为 henry指向了arsenal(亨利永远都属于阿森纳!COYG) 所以我们输出team[“henry”]的时候就会输出arsenal 就好像回答你亨利是阿森纳队的一样 我们也可以像第8行那样直接搞 也没有问题 team.count()和set里面的也差不多 但是有一个神奇的现象 注意那个me 我从来没有加过它 结果它竟然在最后遍历的时候也被遍历出来了 但team[“me”]是空的 最后遍历也是迭代器 注意first和second分别代表什么 team.size()也一样
priority_queue优先队列
头文件为queue 构造方式为 priority_queue< ll(类型) > q(变量名)
这是系统默认大根堆 小根堆可以这样
priority_queue< ll(类型),vector< ll >(类型),greater< ll >(类型) > q(变量名)
主要操作代码如下:
int main(){
q.push(10);
cout<<q.top()<<endl;
q.push(1);
cout<<q.top()<<endl;
q.push(100);
cout<<q.top()<<endl;
cout<<"size:"<<q.size()<<endl;
q.pop(); q.pop();
cout<<q.top()<<endl;
cout<<"size:"<<q.size()<<endl;
}
比较好理解 q.push(x)放入元素 但是每次q.top()访问队首都是当前最大的 因为是大根堆 然后q.pop()就是弹出队首 q.size()和之前同理
累 over COYG