Vector::去重、置乱

无序去重:

template <typename T> int Vector<T>::deduplicate() { //删除无序向量中重复元素(高效版)
   int oldSize = _size; //记录原规模
   Rank i = 1; //从_elem[1]开始
   while (i < _size) //自前向后逐一考查各元素_elem[i]
      (find(_elem[i], 0, i) < 0) ? //在其前缀中寻找与之雷同者(至多一个)
         i++ : remove(i); //若无雷同则继续考查其后继,否则删除雷同者
   return oldSize - _size; //向量规模变化量,即被删除元素总数
}

有序去重:

template <typename T> int Vector<T>::uniquify() { //有序向量重复元素剔除算法(高效版)
   Rank i = 0, j = 0; //各对互异“相邻”元素的秩
   while (++j < _size) //逐一扫描,直至末元素
      if (_elem[i] != _elem[j]) //跳过雷同者
         _elem[++i] = _elem[j]; //发现不同元素时,向前移至紧邻于前者右侧
   _size = ++i; shrink(); //直接截除尾部多余元素
   return j - i; //向量规模变化量,即被删除元素总数
}

区间置乱:

template <typename T> void Vector<T>::unsort(Rank lo, Rank hi) { //等概率随机置乱向量区间[lo, hi)
   T* V = _elem + lo; //将子向量_elem[lo, hi)视作另一向量V[0, hi - lo)
   for (Rank i = hi - lo; i > 0; i--) //自后向前
      swap(V[i - 1], V[rand() % i]); //将V[i - 1]与V[0, i)中某一元素随机交换
}
时间: 2024-11-05 13:34:55

Vector::去重、置乱的相关文章

【C++】判断元素是否在vector中,对vector去重,两个vector求交集、并集

#include <iostream> #include <vector> #include <algorithm> //sort函数.交并补函数 #include <iterator> //求交并补使用到的迭代器 using namespace std; //打印容器vector void print_vector(vector<int> v){ if(v.size()>0){ cout<<"{"; for

LeetCode OJ:Remove Duplicates from Sorted Array(排好序的vector去重)

Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this in place with constant memory. For example,Given input array nums 

vector 去重

1.使用unique函数: 1 sort(v.begin(),v.end()); 2 v.erase(unique(v.begin(), v.end()), v.end()); 3 //unique()函数将重复的元素放到vector的尾部 然后返回指向第一个重复元素的迭代器 再用erase函数擦除从这个元素到最后元素的所有的元素 4 2.使用set: 1 #include <iostream> 2 #include <vector> 3 #include <set>

vector某元素是否存在、查找指定元素 、去重

vector.map 判断某元素是否存在.查找指定元素 [C++]判断元素是否在vector中,对vector去重,两个vector求交集.并集 PS:注意重载 原文地址:https://www.cnblogs.com/LLbinGG/p/9417347.html

vector基础

1 //STL基础 2 //容器 3 //vector 4 5 #include "iostream" 6 #include "cstdio" 7 #include "vector"//向量 8 #include "iterator"//迭代器 9 #include "numeric"//accunulate()求和算法需要 10 #include "algorithm"//revers

hiho_1079_离散化

题目 在长度为L的宣传栏上张贴N张海报,将宣传栏分为L个长度为1的单位,海报长度为整数,且高度和宣传栏相同,左右边界和宣传栏单位之间缝隙重合(即海报总是跨越整数个单位).后贴的海报可能会覆盖之前贴的海报的全部或者部分,问N张海报贴完之后,没有被完全覆盖的海报的总数.N <= 10^6, L <= 10^9. 分析 区间覆盖问题,会想到用线段树来解决,直观的将L个单位视为线段树的叶子节点,但是这样做空间复杂度太高(同样时间复杂度也很高),可以将区间进行离散化:     将所有海报的边界先收集起来

C++Primer 第五版 练习10.12解答

练习10.12:编写名为compareIsbn的函数,比较两个Sales_data对象的isbn().使用这个函数排序一个保存Sales_data对象的vector. 关于这道题的说明:初看,这道题好像难度系数不高,而且我想许多人的第一印象,应该是可以过了吧,但等我真正去写这道题的时候,才发现,自己真是too young,too simple了,确实,按照题面确实不难,咋一看,把前面一题写的拿过来用就好了.但你真的去写了,就会发现,前面坑无数,尤其是第一次写这道题. 1.首先,按题目要求,定义c

[学习][STL]unique和erase

//在vector中的应用#include <iostream> #include<cstdio> #include<vector> #include<algorithm> using namespace std; vector<int> a;vector<int>::iterator p; int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++

Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)

A. 签到题:思路为:所求答案 = 9 * (字符长度 - 1) + 最高位数 +(- 1)//通过判断语言确定是否需要再减个一 如果a****** > *******则需要加一反之不需要 #include <bits/stdc++.h> using namespace std; typedef long long ll; int main () { ll t; cin >> t; while(t--) { ll ans; ll temp = 0; string num; c

算法提高课——搜索

BFS 求最小 基迭代,不会爆栈 Flood fill算法: 可以在线性时间复杂度内,找到某个点所在的连通块. //Home键到行首,End键到行尾 AcWing 1097. 池塘计数 AcWing 1098. 城堡问题 AcWing 1106. 山峰和山谷 最短路模型: 所有边权相等时,可以在线性时间内得到单源或多源最短路(可视为特殊的dijkstra) AcWing 1076. 迷宫问题 AcWing 188. 武士风度的牛 AcWing 1100. 抓住那头牛 AcWing 173. 矩阵