笔试过程中往往会使用一些常用数据结构,大多数时候标准语言提供的需要做进一步转化,这里把用到的记录到这里,方便以后使用到的时候查找。
1.topN相关heap实现,top N 个最小数,Top N个最大数
#include <iostream>
#include <algorithm>
#include <queue>
#include <functional>
template <typename T, size_t N, typename Compare = std::greater<T>>
class TopNHeap {
public:
const T& top() {
return _heap.top();
}
void push(const T& e) {
if (_size == 0) {
return;
}
if (_heap.size() >= _size) {
if (cmp(e, _heap.top())) {
_heap.pop();
_heap.push(e);
}
} else {
_heap.push(e);
}
}
void pop() {
_heap.pop();
}
bool empty() {
return _heap.empty();
}
size_t size() {
return _heap.size();
}
private:
Compare cmp;
const size_t _size = N;
std::priority_queue<T, std::deque<T>, Compare> _heap;
};
// 保存前Top N个最大数
template <typename T, size_t N>
using BigTopNHeap = TopNHeap<T, N, std::greater<T>>;
// 保存前Top N个最小数
template <typename T, size_t N>
using SmallTopNHeap = TopNHeap<T, N, std::less<T>>;
int main() {
SmallTopNHeap<int, 3> topthree;
for (int i = 20; i > 0; --i) {
topthree.push(i);
}
std::cout << topthree.size() << std::endl;
while (!topthree.empty()) {
std::cout << topthree.top() << std::endl;
topthree.pop();
}
return 0;
}
2.标准输入的读取,读入N个元素到vector中
#include <iostream>
#include <vector>
// 从标准输入读入N个空格或者换行分割的相同类型的元素,通过数组返回。
template <typename T>
std::vector<T> ReadNFromCin(size_t n) {
std::vector<T> ret;
if (n == 0) {
return ret;
}
ret.resize(n);
for (size_t i = 0; i < n; ++i) {
std::cin >> ret[i];
}
return ret;
}
// 在一行里面空格分隔打印数组
template<class T>
void PrintVector(const std::vector<T>& vec) {
for (const auto &val:vec) {
std::cout << val << " ";
}
std::cout << std::endl;
}
int main() {
int n = 0;