初识Vector

序言:在洛谷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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值