vector中insert()的用法
iterator insert( iterator loc, const TYPE &val );
void insert( iterator loc, size_type num, const TYPE &val );
void insert( iterator loc, input_iterator start, input_iterator end );
insert() 函数有以下三种用法:
在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,
在指定位置loc前插入num个值为val的元素
在指定位置loc前插入区间[start, end)的所有元素 .
举例:
代码1
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> v(4,0);//v:0 0 0 0
v[0]=2;
v[1]=7;
v[2]=9;
v[3]=5;//此时v:2 7 9 5
v.insert(v.begin(),8);//在最前面插入新元素,此时v为8 2 7 9 5
v.insert(v.begin()+3,1);//在迭代器中下标为3的元素前插入新元素,此时v为8 2 7 1 9 5
v.insert(v.end(),3);//在向量末尾追加新元素,此时v为8 2 7 1 9 5 3
v.insert(v.end(),3,0);//在尾部插入3个0,此时v为8 2 7 1 9 5 3 0 0 0
int a[] = {1,2,3,4};
v.insert(v.end(),a[2],a[1]);//在尾部插入a[2]个a[1],此时v为8 2 7 1 9 5 3 0 0 0 2 2 2
vector<int>::iterator it;
for(it=v.begin(); it!=v.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
return 0;
}
//输出为 8 2 7 1 9 5 3 0 0 0 2 2 2
例题P1168 中位数
题目描述
给定一个长度为 N 的非负整数序列 A,对于前奇数项求中位数。
输入格式
第一行一个正整数 N
第二行 N 个正整数 A1…NA 1…N。
输出格式
共(N+1)/2下取整行,第 i行为(A1…2i−1)的中位数。
输入
7
1 3 5 7 9 11 6
输出
1
3
5
6
题目来源[(https://www.luogu.com.cn/problem/P1168)]
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N = 100010;
int n;
int a[N];
int main()
{
cin>>n;
for(int i = 1; i<=n; i++) cin>>a[i];
vector<int> ans;
for(int i = 1; i<=n; i++)
{
//lower_bound 返回指向第一个值不小于 val 的位置,也就是返回第一个大于等于val值的位置。(通过二分查找)
//upper_bound 返回第一个大于val值的位置。(通过二分查找)
//意思就是在容器ans里面,找到第一个大于a[i]的位置,并把a[i]插进ans容器里面
ans.insert(upper_bound(ans.begin(),ans.end(),a[i]),a[i]);//二分插入保证单调性
if(i%2==1) cout<<ans[(i-1)/2]<<endl;//当为奇数项是输出其序列中的中位数
}
return 0;
}
代码2
//创建一个vector,置入字母表的前十个字符
vector <char> a;
for( int i=0; i < 10; i++ )
a.push_back( i + 65 );
//插入四个C到vector中
vector <char>::iterator i = a.begin();
a.insert( i, 4, 'C' );
//显示vector的内容
for( i = a.begin(); i != a.end(); i++ )
cout < < *i;
代码3
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> v(3);
v[0]=2;
v[1]=7;
v[2]=9;
v.insert(v.begin(),8);//在最前面插入新元素。
v.insert(v.begin()+2,1);//在迭代器中第二个元素前插入新元素
v.insert(v.end(),3);//在向量末尾追加新元素。
vector<int>::iterator it;
for(it=v.begin(); it!=v.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
代码4(1626链表元素分类)
//Splitting分裂,分割 rearrange重新安排 the negative values负值
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const int N = 100010;
int n,k;
int h,e[N],ne[N];
int st[N];
int main()
{
cin>>h>>n>>k;
for(int i = 0; i<n; i++)
{
int address,data,next;
cin>>address>>data>>next;
e[address] = data,ne[address] = next;
}
vector<int> a,b,c;//负值,值大于k,正值
for(int i = h; i!=-1; i = ne[i])
{
int v = e[i];
if(v<0) a.push_back(i);
else if(v<=k) b.push_back(i);
else c.push_back(i);
}
a.insert(a.end(),b.begin(),b.end());
a.insert(a.end(),c.begin(),c.end());
for(int i = 0; i<a.size(); i ++)
{
printf("%05d %d ",a[i],e[a[i]]);
if(i+1 == a.size()) puts("-1");
else printf("%05d\n",a[i+1]);
}
return 0;
}
可以把那个一行代码求解动态中位数的也写上,我觉得蛮妙的,利用二分+insert,让每次插入新的元素后vector都保持有序,这样每次就可以O(1)查询中位数啦!
好!明天我加上