算法与竞赛(第五章)—第1关:STL模板之动态数组:向量vector的操作


任务描述

本关任务:仔细阅读下文向量vector的相关操作,并使用vector完成对n个整数序列的插入、删除和排序功能。

相关知识

为了完成本关任务,你需要掌握:1.向量的概念;2.插入元素;3.删除元素;4.基于sort对向量排序;5.遍历向量;6.清空向量。

向量的概念

向量vector:是一种顺序容器,与数组类似,但它比数组更优越。数组不能动态拓展,在程序运行的时候可能造成内存浪费和访问越界。而vector正好可以弥补这一缺陷,可动态分配和拓展内存,它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。

向量作为基本数组的类模板,被包含在vector头文件中,定义方式如下(注意搭配algorithmusing namespace std一起使用):

  • vector<int> v1,定义一个元素为类型为int 整型的向量v1
  • vector<string> v2(10),定义一个元素为类型为string字符串类型的向量v2,初始存储空间大小为10,每个元素初始为空串
  • vector<node> v3,定义一个元素为类型为node类型的向量v3,其中node一般是结构体等自定义数据类型
插入元素

往向量插入一个元素通过调用push_back()方法实现(在向量末尾插入),另外也可以通过下标访问的方式直接在指定位置插入元素(前提是该位置已经被分配内存空间),如下实例:

 
  1. vector <int> vec; // 创建一个整型向量vec
  2. vec.push_back(1); // 向vec插入一个元素1
  3. vec.push_back(2); // 向vec插入一个元素2
  4. vec[1] = 3; // 直接在位置1插入元素3,原来的元素2被元素3覆盖了
  5. // 目前vec包含 1, 3两个元素
删除元素

向量的删除与插入相对应,包含队尾删除和指定位置删除:队尾删除通过调用pop_back()方法,注意,它并不会返回被删除的元素;指定位置的删除是基于迭代器iterator 实现的,迭代器相对应数组的指针,指向向量的存储地址,通过调用erase(iterator pos)方法删除迭代器位置pos所在的元素,基于上述vec的实例如下:

 
  1. vec.pop_back(); // 删除了元素3
  2. vector<int>::iterator pos = vec.begin(); //定义一个vector<int>的迭代器pos,并指向vec的首地址
  3. cout<<*pos; // 与指针一样,通过*访问地址上的值,输出为1
  4. vec.erase(pos); // 删除迭代器地址pos及其元素,目前pos为vec首地址,元素值为1,删除之后元素为空,不包含任何元素了
基于sort对向量排序

向量是基于数组的类模板,同样可以用sort函数完成排序,使用方式如下:

 
  1. sort(vec.begin(), vec.end()); // 默认从小到大排序
遍历向量

向量的遍历可以通过下标访问和迭代器访问的方式:

 
  1. for(int i=0;i<vec.size();i++) // size()返回当前向量vec的大小
  2. cout<<vec[i];
  3. for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
  4. cout<<*it;
清空向量

向量的清空通过调用clear()方法实现,清空后向量大小变为0

 
  1. vec.clear()
编程要求

本关的编程任务是补全右侧代码片段mainBeginEnd中间的代码,具体要求如下:

  • 创建一个整型类型的向量vec
  • 读取数据:序列个数n,以及n个整数并插入向量vec
  • 通过erase操作删除向量vec中的重复元素:保留第一次出现的元素,删除之后出现的重复元素;
  • 使用Algorithm模板函数sort对向量vec里的元素从小到大排序;
  • 遍历向量vec并输出:元素中间空格隔开,末尾加换行符\n
  • 调用clear清空向量。
测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入: 7 1 2 3 1 2 3 4 预期输出: 1 2 3 4 0

输入格式: 第一行:序列个数n 第二行:n个整数序列 输出格式: 第一行:遍历并输出向量,中间空格隔开,末尾换行\n 第二行:非学员输出,数值0用于检测向量是否清空

//
//  main.cpp
//  step1
//
//  Created by ljpc on 2018/7/23.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(int argc, const char * argv[]) {
    
    
    // 请在这里补充代码,完成本关任务
    /********* Begin *********/
    // 1.构建整型向量vec
    vector<int> vec;
    int n;
    // 2.读取数据:序列个数n,以及n个整数并存入向量vec
    cin >> n;
    vector<int>::iterator pos;
    for (int i = 0; i < n; i++){
        int num;
        cin >>num;
        vec.push_back(num);
    }
    // 3.删除向量vec中的重复元素
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), vec.end());
    
    // 4.使用Algorithm模板函数sort对vec排序:从小到大
    sort(vec.begin(), vec.end());

    // 5.遍历向量vec并输出,元素中间空格隔开,末尾加换行符'\n'
    for (pos = vec.begin(); pos != vec.end(); pos++) {
        cout << *pos;
        if (next(pos) != vec.end()) {  // 使用next函数获取下一个迭代器,然后和end()比较
        cout << " ";
        }
    }

    //两个方法都可以

    // for (int i = 0; i < vec.size(); i++) {
    //     cout << vec[i];
    //     if (i != vec.size() - 1) {
    //     cout << " ";
    //     }
    // }
    cout << endl;
    
    // 6.清空向量vec
    vec.clear();

    /********* End *********/
    printf("%d\n", int(vec.size()));
    
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值