任务描述
本关任务:仔细阅读下文向量vector
的相关操作,并使用vector
完成对n
个整数序列的插入、删除和排序功能。
相关知识
为了完成本关任务,你需要掌握:1.向量的概念;2.插入元素;3.删除元素;4.基于sort
对向量排序;5.遍历向量;6.清空向量。
向量的概念
向量vector
:是一种顺序容器,与数组类似,但它比数组更优越。数组不能动态拓展,在程序运行的时候可能造成内存浪费和访问越界。而vector
正好可以弥补这一缺陷,可动态分配和拓展内存,它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。
向量作为基本数组的类模板,被包含在vector
头文件中,定义方式如下(注意搭配algorithm
和using namespace std
一起使用):
vector<int> v1
,定义一个元素为类型为int
整型的向量v1
vector<string> v2(10)
,定义一个元素为类型为string
字符串类型的向量v2
,初始存储空间大小为10
,每个元素初始为空串vector<node> v3
,定义一个元素为类型为node
类型的向量v3
,其中node
一般是结构体等自定义数据类型
插入元素
往向量插入一个元素通过调用push_back()
方法实现(在向量末尾插入),另外也可以通过下标访问的方式直接在指定位置插入元素(前提是该位置已经被分配内存空间),如下实例:
vector <int> vec; // 创建一个整型向量vec
vec.push_back(1); // 向vec插入一个元素1
vec.push_back(2); // 向vec插入一个元素2
vec[1] = 3; // 直接在位置1插入元素3,原来的元素2被元素3覆盖了
// 目前vec包含 1, 3两个元素
删除元素
向量的删除与插入相对应,包含队尾删除和指定位置删除:队尾删除通过调用pop_back()
方法,注意,它并不会返回被删除的元素;指定位置的删除是基于迭代器iterator
实现的,迭代器相对应数组的指针,指向向量的存储地址,通过调用erase(iterator pos)
方法删除迭代器位置pos
所在的元素,基于上述vec
的实例如下:
vec.pop_back(); // 删除了元素3
vector<int>::iterator pos = vec.begin(); //定义一个vector<int>的迭代器pos,并指向vec的首地址
cout<<*pos; // 与指针一样,通过*访问地址上的值,输出为1
vec.erase(pos); // 删除迭代器地址pos及其元素,目前pos为vec首地址,元素值为1,删除之后元素为空,不包含任何元素了
基于sort
对向量排序
向量是基于数组的类模板,同样可以用sort
函数完成排序,使用方式如下:
sort(vec.begin(), vec.end()); // 默认从小到大排序
遍历向量
向量的遍历可以通过下标访问和迭代器访问的方式:
for(int i=0;i<vec.size();i++) // size()返回当前向量vec的大小
cout<<vec[i];
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
cout<<*it;
清空向量
向量的清空通过调用clear()
方法实现,清空后向量大小变为0
:
vec.clear()
编程要求
本关的编程任务是补全右侧代码片段main
中Begin
至End
中间的代码,具体要求如下:
- 创建一个整型类型的向量
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;
}