LIPH's C++ Codes
algorithm.h
Go to the documentation of this file.
1#ifndef LIPH_ALGORITHM_H_
2#define LIPH_ALGORITHM_H_
3
4#include <cassert>
5#include <functional>
6#include <queue>
7#include <set>
8#include <vector>
9
10namespace liph {
11
13template <class T>
14void erase(std::vector<T>& v, const std::set<size_t>& idx) {
15 if (idx.empty()) return;
16 auto it = idx.begin();
17 size_t size = 0;
18 for (size_t i = 0; i < v.size(); ++i) {
19 if (it != idx.end() && i == *it) {
20 ++it;
21 } else {
22 if (size != i) {
23 v[size] = std::move(v[i]);
24 }
25 ++size;
26 }
27 }
28 v.resize(size);
29}
30
31template <class T>
32std::vector<T> topk(const std::vector<T>& data, size_t k) {
33 if (k == 0) return {};
34 if (data.size() <= k) return data;
35
36 std::vector<T> ans;
37 std::priority_queue<T, std::vector<T>, std::greater<T>> q(data.begin(), data.begin() + k);
38 for (size_t i = k; i < data.size(); i++) {
39 if (data[i] > q.top()) {
40 q.pop();
41 q.push(data[i]);
42 }
43 }
44 for (size_t i = 0; i < k; i++) {
45 ans.emplace_back(q.top());
46 q.pop();
47 }
48 return ans;
49}
50
51template <class T>
52T find_kth(const std::vector<T>& data, size_t k) {
53 assert(data.size() > 0 && k >= 1 && k <= data.size());
54 std::priority_queue<T> q(data.begin(), data.end());
55 for (size_t i = 0; i < k - 1; i++) {
56 q.pop();
57 }
58 return q.top();
59}
60
61template <class T>
62int binary_search(T a[], int n, T val) {
63 int i = 0, j = n, mid;
64 while (i < j) {
65 mid = i + (j - i) / 2;
66 if (a[mid] == val) return mid;
67 if (a[mid] < val) {
68 i = mid + 1;
69 } else {
70 j = mid;
71 }
72 }
73 return -1;
74}
75
76} // namespace liph
77
78#endif // LIPH_ALGORITHM_H_
Definition: algorithm.h:10
T find_kth(const std::vector< T > &data, size_t k)
Definition: algorithm.h:52
std::vector< T > topk(const std::vector< T > &data, size_t k)
Definition: algorithm.h:32
int binary_search(T a[], int n, T val)
Definition: algorithm.h:62
void erase(std::vector< T > &v, const std::set< size_t > &idx)
Erases the specified elements from v, according to index in idx.
Definition: algorithm.h:14