Files
STLite-ACM-2024/priority_queue/data/one/code.cpp
2024-02-29 23:42:09 +08:00

120 lines
2.4 KiB
C++

#include <iostream>
#include <queue>
#include <ctime>
#include <cstdlib>
#include "priority_queue.hpp"
void TestConstructorAndPush()
{
std::cout << "Testing constructors, destructor and push..." << std::endl;
sjtu::priority_queue<int> pq;
for (int i = 100; i > 0; --i) {
pq.push(i);
}
while (!pq.empty()) {
std::cout << pq.top() << " ";
pq.pop();
}
std::cout << std::endl;
for (int i = 1000; i > 100; --i) {
pq.push(i);
}
sjtu::priority_queue<int> pqBack(pq);
std::cout << pqBack.size() << std::endl;
sjtu::priority_queue<int> pqBB;
for (int i = 10; i <= 10000; ++i) {
pqBB.push(i);
}
std::cout << pqBB.size() << std::endl;
pqBB = pq;
std::cout << pqBB.size() << std::endl;
}
void TestSize()
{
std::cout << "Testing size()" << std::endl;
sjtu::priority_queue<long long> pq;
for (int i = 1; i <= 1000; ++i) {
pq.push(rand());
}
std::cout << pq.size() << std::endl;
}
void TestException()
{
sjtu::priority_queue<int> pq;
try {
std::cout << pq.top() << std::endl;
} catch (...) {
std::cout << "Throw correctly." << std::endl;
}
}
struct Natural {
int x;
Natural(int _x = 0) { x = _x; }
friend bool operator<(const Natural &lhs, const Natural &rhs) {
if (lhs.x < 0 || rhs.x < 0)
throw sjtu::runtime_error();
return lhs.x < rhs.x;
}
};
void TestCompareException() {
std::cout << "Testing compare exception...";
sjtu::priority_queue<Natural> pq;
static int dat[2000], ans[2000];
int pos = 0;
for (int i = 1; i <= 1000; ++i) {
dat[i] = i;
if (rand() % 10 == 0)
dat[i] = -i;
else ans[++pos] = i;
}
for (int i = 1000; i > 1; --i) {
unsigned int x = rand();
int p = x % (i - 1) + 1;
std::swap(dat[i], dat[p]);
}
while (dat[1] < 0) {
unsigned int x = rand();
int p = x % 1000 + 1;
std::swap(dat[1], dat[p]);
}
for (int i = 1; i <= 1000; ++i) {
try {
pq.push(Natural(dat[i]));
} catch (sjtu::runtime_error) {
if (dat[i] >= 0)
return std::cout << std::endl, void();
}
}
for (int i = pos; i; --i) {
Natural t = pq.top();
if (t.x != ans[i])
return std::cout << std::endl, void();
pq.pop();
}
std::cout << "ok." << std::endl;
}
int main(int argc, char *const argv[])
{
TestConstructorAndPush();
TestSize();
TestException();
TestCompareException();
return 0;
}