7.14 vector 南阳理工测评的数据结构题
来源:互联网 发布:限制p2p网络连接数 编辑:程序博客网 时间:2024/06/16 06:15
vectorarray; array.push_back(1); array.push_back(6); array.push_back(3); array.push_back(6); array.push_back(6); array.push_back(2); vector ::iterator itor; for(itor=array.begin();itor!=array.end();) { if(6==*itor) { itor=array.erase(itor); } else { itor++; } } for(itor=array.begin();itor!=array.end();itor++)cout<<(*itor)<
(向量) 一种数据结构 相当于动态的数组 当我们无法知道自己需要的数组规模多大的时候 用来解决问题可以达到最大节约空间的目的
个人总结:
1.头文件#include <vector>
2.创建vector对象 vector<int>vec (像创建队列栈一样) 等于声明了一个int的数组vec[]大小没有制定 可以动态向里面添加或删除
如果想要声明一个二维数组的话 vector<int*>a 三维的话vector<int**>a
4.具体用法和调用
例如:
vecotr<int*>a;
int b=5;
a.push_back(b);
cout<<a[0];//输出结果为5
push_back:在数组的最后添加一个数据
pop_back:去掉数组最后一个数据
at:得到编号位置的数据
begin:得到数组头的指针
end:得到最后一个单元+1的指针
front:得到数组头的引用
back:得到最后一个单元的引用
max_size:vector最大可以是多少
capacity:当前vector分配的大小
size:当前数据的大小
empty:判断是否为空
swap :与另外的vector交换数据
具体应用:
c.erase(pos):删除pos位置的数据 返回pos+1的位置
c.erase(beg,end):删除beg到end的数据 删除后会往前移动吗//使用时候注意 这里涉及到迭代器 iterator 返回的是end+1的位置
迭代器iterator:是一种检查容器内元素并且遍历元素的数据类型 又称为“游标模式” 提供一种方法访问容器
例如:
vector<int> array;
array.push_back(1);
array.push_back(6);
array.push_back(3);
array.push_back(6);
array.push_back(6);
array.push_back(2);
vector<int>::iterator itor;
for(itor=array.begin();itor!=array.end();)
{
if(6==*itor)
{
itor=array.erase(itor); //如果是6就让这个指针指向下一个指针
}
else
{
itor++;
}
}
for(itor=array.begin();itor!=array.end();itor++)
cout<<(*itor)<<endl;
所以用erase就要用到迭代器去遍历 然后才可以向前移动
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int N;
cin>>N;
vector<int>c;
int i;
for(i=0;i<N;i++)
c.push_back(i);
char name[64][20];
for(i=0;i<N;i++)
{
cin>>name[i];
}
int W,S;
char a;
cin>>W>>a>>S;
int k=1;
vector<int>::iterator ite;
for(ite=c.begin()+W;ite!=c.end();)
{
k++;
if(k==S)
{
k=0;cout<<name[*(ite)]<<endl;
ite=c.erase(ite);
}
else ite++;
if(ite>=c.end())
ite=c.begin();
}
system("pause");
return 0;
}
讨论一下用vector<char> string char*的性能差别
总结一下STL:标准模板库,重要特点是数据结构和算法的分离,六大组件:容器 迭代器 算法 仿函数 迭代适配器 空间制配器
括号配对问题
错误解法:
#include <iostream>
#include <stack>
using namespace std;
int main()
{
int N;
char a;
bool flag;
cin>>N;
stack<char>fuhao;
while(N--)
{
flag=true;
do
{
cin>>a;
if(a=='('||a=='[')
fuhao.push(a);
else if(a==')')
{
if(fuhao.empty())
{flag=false;break;}
else if(fuhao.top()!='(')
{flag=false;break;}
else fuhao.pop();
}
else if(a==']')
{
if(fuhao.empty())
{flag=false;break;}
else if(fuhao.top()!='[')
{flag=false;break;}
else fuhao.pop();
}
}while(a!='\n');
if(flag==true)
cout<<"yes"<<endl;
else cout<<"no"<<endl;
while(fuhao.size()>0)
fuhao.pop();
}
system("pause");
return 0;
}
这里错在 因为我是一行的输入进去 都在缓冲区 当我识别到一个错误的时候 break出来 虽然我把栈里面的东西都pop掉 但是我缓冲区还有东西
所以下一次就没有让我输入 直接用上一次缓冲区还有的符号
还有一个问题是 识别不了最后的换行符号 即a!=0这里
解决方法 1清空缓冲区
#include <iostream>
#include <stack>
using namespace std;
int main()
{
int N;
char a;
bool flag;
cin>>N;
stack<char>fuhao;
while(N--)
{
flag=true;
cin.sync();
cin>>a;
while(a!='\n')
{
if(a=='('||a=='[')
fuhao.push(a);
else if(a==')')
{
if(fuhao.empty())
{flag=false;break;}
else if(fuhao.top()!='(')
{flag=false;break;}
else fuhao.pop();
}
else if(a==']')
{
if(fuhao.empty())
{flag=false;break;}
else if(fuhao.top()!='[')
{flag=false;break;}
else fuhao.pop();
}
cin.get(a);
}
if(flag==true)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
while(fuhao.size()>0)
fuhao.pop();
}
system("pause");
return 0;
}
问题都解决了 数据都过了 但是还没能ac???
有可能错在数据的长度问题 网上搜索的答案是用数组来做的
尝试一下
#include <iostream>
#include <string.h>
#include <stack>
using namespace std;
int main()
{
int N;int str;
stack<char>fuhao;
char f[10000];
cin>>N;
int i;
bool flag;
while(N--)
{
flag=true;
cin>>f;
str=strlen(f);
if(str%2==1) flag=false;
else
{
for(i=0;i<str;i++)
{if(f[i]=='('||f[i]=='[')
fuhao.push(f[i]);
else if(f[i]==')')
{if(fuhao.empty())
{flag=false;break;}
else if(fuhao.top()!='(')
{flag=false;break;}
else fuhao.pop();
}
else if(f[i]==']')
{if(fuhao.empty())
{flag=false;break;}
else if(fuhao.top()!='[')
{flag=false;break;}
else fuhao.pop();
}
}
while(fuhao.size()>0)
fuhao.pop();
}
if(flag==true)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
这个是ac的答案
反思总结:
那种有告诉字符串长度的 一般都放在数组中 然后用strlen里计算长度就可以一个个地用 要包含头文件string.h
然后这里一个小技巧 配对问题一定会是双数 所以一开始判断出单数就可以直接false break
- 7.14 vector 南阳理工测评的数据结构题
- 南阳理工16题
- 南阳理工oj6题
- 南阳理工第五题
- 南阳理工第六题
- 南阳理工第七题
- 南阳理工第八题
- 南阳理工第十题
- 南阳理工12题
- 南阳理工14题
- 南阳理工16题
- 南阳理工17题
- 南阳理工18题
- 南阳理工19题
- 南阳理工20题
- 南阳理工29题
- 7.25南阳理工acm评测系统数据结构
- 南阳理工 吝啬的国度
- PHP去除html的宽高属性的正则表达式
- nodejs--的整个运行体制--这个是错的:/捂脸
- AngularJs的forEach循环
- jquery 无法获取表单数据的问题
- PHP源码分析-数组
- 7.14 vector 南阳理工测评的数据结构题
- java学习【web基础-jQuery入门】
- Linux获取/dev/input目录下的event对应的设备
- va_start和va_end使用详解
- C/C++语言字符串操作总结
- 查找算法
- apk检查更新下载安装
- c# my sql 字段出现0000-00-00 00:00:00时实体转换失败
- Android6.0如何在运行期间申请权限Requesting Permissions at Run Time