序言:在洛谷OJ上刷题时第一次尝试使用vector,之后会有补充
试题链接:P1540 机器翻译https://www.luogu.org/problem/show?pid=1540
代码:
#include<bits/stdc++.h>
using namespace std;
std::vector<int> c;
int main(){
int M,N,num;
int ans = 0;
scanf("%d %d",&M,&N);
for(int i = 0;i < N;i++){
scanf("%d",&num);
if(find(c.begin( ), c.end( ), num) == c.end()){//没找到
if(c.size() >= M){
c.erase(c.begin());
}
c.push_back(num);
ans++;
}
}
cout << ans;
return 0;
}
函数 | 功能 |
---|---|
c.capacity() | 返回容器中数据个数。(这里不能用这个,注意他与c.size() 的区别) |
c.size() | 返回容器中实际数据的个数。 |
c.end() | 指向迭代器中的最后一个数据地址。 |
c.erase(pos) | 删除pos位置的数据,传回下一个数据的位置。 |
c.rbegin() | 传回一个逆向队列的第一个数据。 |
c.push_back(elem) | 在尾部加入一个数据。 |
补充一个STL里的find()查找特定元素的出现位置,注意返回值不是整型
一个find Vector的例子,注意!!!find不属于vector的成员,而存在于algorithm中,别忘了加上头文件#include :
#include <vector>
#include <algorithm>
#include <iostream>
int main( )
{
using namespace std;
vector<int> L;
L.push_back( 1 );
L.push_back( 2 );
L.push_back( 3 );
L.push_back( 4 );
L.push_back( 5 );
vector<int>::iterator result = find( L.begin( ), L.end( ), 3 ); //查找3
if ( result == L.end( ) ) //没找到
cout << "No" << endl;
else //找到
cout << "Yes" << endl;
}
如何遍历vector中的元素:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v2(10);
v2.push_back(15);
for(int i=0; i<v2.size(); i++)
{
cout<<v2[i]<<endl;
}
system("pause");
return 0;
}
元素的删除
删除vector中的元素,最容易的方法就是使用vector的erase()函数。
vector vec;
for ( vector::iterator iter = vec.begin(); iter! = vec.end();)
{
if(某条件成立)
iter = vec.erase(iter);
else
iter ++;
}
如果要清空vector中的元素,可以使用erase()循环删除,也可以用clear()函数。
for ( vector::iterator iter = vec.begin(); iter! = vec.end();)
{
iter = vec.erase(iter);
}
//或者直接clear
vec.clear();
需要注意,如果vector中存储的元素是指针,那么erase()或者clear()并不会删除指针指向的对象或者内存空间,要小心内存泄漏问题。
此外,还需要注意的是,erase()函数虽然会删除指定位置的元素,但是元素所占用的内存空间并不会被释放掉,也就是说,被删除的元素所占的内存空间还是被vector占有的,而没有被系统回收。
要解决这个问题可以使用vector中的swap()函数。
假设vector vec起初有1000个元素,后来删掉500个,那么要释放掉那500个int所占的空间,可以这样:
std::vector(vec).swap(vec);
//上面这行代码相当于下面两行
//即先产生一个跟vec中现有内容相同且占用空间刚好满足其大小的vector tmp
//然后把tmp与vec对换
//当出了tmp的作用域(例如下面的一对大括号)后,tmp所占的空间就被释放掉了
{
std::vector tmp(vec);
tmp.swap(vec);
}