1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <ctime>
#include <iomanip>
struct MyPred
{
std::string x;
std::string y;
// add default values
MyPred(const std::string& x = "", const std::string& y = ""): x(x), y(y) {}
bool operator==(const MyPred& p) const
{
return x == p.x && y == p.y;
}
bool operator<(const MyPred& p) const
{
if(x < p.x) return true;
if(x > p.x) return false;
if(y < p.y) return true;
if(y > p.y) return false;
return false;
}
};
int main()
{
std::vector<MyPred>* vPred = new std::vector<MyPred>;
MyPred pred;
std::cout.precision(2);
std::cout << std::fixed;
std::cout << "Initialising data: ";
clock_t begin = clock();
for(int i = 0; i < 60000; i++)
{
std::stringstream ss1;
ss1 << i;
pred.x = ss1.str();
std::stringstream ss2;
ss2 << i+1;
pred.y = ss2.str();
vPred->push_back(pred);
}
for(int i = 10; i < 25; i++)
{
std::stringstream ss1;
ss1 << i;
pred.x = ss1.str();
std::stringstream ss2;
ss2 << i+1;
pred.y = ss2.str();
vPred->push_back(pred);
}
for(int i = 35000; i < 35005; i++)
{
std::stringstream ss1;
ss1 << i;
pred.x = ss1.str();
std::stringstream ss2;
ss2 << i+1;
pred.y = ss2.str();
vPred->push_back(pred);
}
clock_t end = clock();
std::cout << double(end - begin)/CLOCKS_PER_SEC << "sec for " << vPred->size() << " items\n";
/*vPred->push_back(MyPred("a", "a"));
vPred->push_back(MyPred("a", "b"));
vPred->push_back(MyPred("a", "a"));
vPred->push_back(MyPred("b", "a"));
vPred->push_back(MyPred("a", "b"));
vPred->push_back(MyPred("a", "c"));
vPred->push_back(MyPred("b", "b"));
vPred->push_back(MyPred("a", "a"));
vPred->push_back(MyPred("a", "a"));*/
std::cout << "Sorting data : ";
begin = clock();
// The values need to be in order for equal_range() to work
std::sort(vPred->begin(), vPred->end());
end = clock();
std::cout << double(end - begin)/CLOCKS_PER_SEC << "sec for " << vPred->size() << " items\n";
std::cout << "Searching data : ";
begin = clock();
std::vector<MyPred> uPred; // values that were always unique
std::vector<MyPred> dPred; // values that were duplicated
std::pair<std::vector<MyPred>::iterator, std::vector<MyPred>::iterator> ret;
for(std::vector<MyPred>::iterator i = vPred->begin(); i != vPred->end(); i = ret.second)
{
ret = std::equal_range(i, vPred->end(), *i);
if(ret.second - ret.first != 1) // duplicates
{
for(std::vector<MyPred>::iterator j = ret.first; j != ret.second; ++j)
{
dPred.push_back(*i); //put each duplicate onto a new vector
}
}
else if(ret.second - ret.first == 1)
{
uPred.push_back(*i);
}
}
end = clock();
std::cout << double(end - begin)/CLOCKS_PER_SEC << "sec\n";
std::cout << "Printing data :\n";
begin = clock();
std::cout << "vPred: Sorted input\n";
/*for(std::vector<MyPred>::iterator i = vPred->begin(); i != vPred->end(); ++i)
{
std::cout << "[" << i->x << ", " << i->y << "]" << '\n';
}*/
std::cout << "dPred: Only the values that were duplicated\n";
for(std::vector<MyPred>::iterator i = dPred.begin(); i != dPred.end(); ++i)
{
std::cout << "[" << i->x << ", " << i->y << "]" << '\n';
}
end = clock();
std::cout << '\n' << double(end - begin)/CLOCKS_PER_SEC << "sec\n";
/*std::cout << "uPred: Only the values that were unique\n";
for(std::vector<MyPred>::iterator i = uPred.begin(); i != uPred.end(); ++i)
{
std::cout << "[" << i->x << ", " << i->y << "]" << '\n';
}*/
delete vPred;
}
|
Initialising data: 0.33sec for 60020 items
Sorting data : 0.10sec for 60020 items
Searching data : 0.07sec
Printing data :
vPred: Sorted input
dPred: Only the values that were duplicated
[10, 11]
[10, 11]
[11, 12]
[11, 12]
[12, 13]
[12, 13]
[13, 14]
[13, 14]
[14, 15]
[14, 15]
[15, 16]
[15, 16]
[16, 17]
[16, 17]
[17, 18]
[17, 18]
[18, 19]
[18, 19]
[19, 20]
[19, 20]
[20, 21]
[20, 21]
[21, 22]
[21, 22]
[22, 23]
[22, 23]
[23, 24]
[23, 24]
[24, 25]
[24, 25]
[35000, 35001]
[35000, 35001]
[35001, 35002]
[35001, 35002]
[35002, 35003]
[35002, 35003]
[35003, 35004]
[35003, 35004]
[35004, 35005]
[35004, 35005]
0.00sec | |