#include <chrono>
#include <iostream>
#include <random>
#include <set>
#include <unordered_set>
#include <vector>
#include <algorithm>
using namespace std::chrono;
int main() {
// Setup 1: Construct two vectors with random integers.
constexpr size_t num = 100000;
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, num);
std::vector<int> random_vec_1;
std::vector<int> random_vec_2;
random_vec_1.reserve(num);
random_vec_2.reserve(num);
for (size_t i = 0u; i < num; ++i) {
random_vec_1.push_back(dis(gen));
random_vec_2.push_back(dis(gen));
}
// Setup 2: Make elements unique.
std::set<int> s1(random_vec_1.begin(), random_vec_1.end());
std::set<int> s2(random_vec_2.begin(), random_vec_2.end());
random_vec_1.assign(s1.begin(), s1.end());
random_vec_2.assign(s2.begin(), s2.end());
std::random_shuffle(random_vec_1.begin(), random_vec_1.end());
std::random_shuffle(random_vec_2.begin(), random_vec_2.end());
std::cout << "size random_vec_1: " << random_vec_1.size() << "\n";
std::cout << "size random_vec_2: " << random_vec_2.size() << "\n";
{
auto begin1 = high_resolution_clock::now();
// Solve problem -------------------------------------------
std::vector<int> new_vec_1(random_vec_1);
std::sort(std::begin(new_vec_1), std::end(new_vec_1));
std::vector<size_t> match_index_2;
match_index_2.reserve(random_vec_2.size());
for (size_t i = 0; i < random_vec_2.size(); ++i) {
if (std::binary_search(std::begin(new_vec_1), std::end(new_vec_1),
random_vec_2[i])) {
match_index_2.push_back(i);
}
}
// ---------------------------------------------------------
auto end1 = high_resolution_clock::now();
auto ticks1 = duration_cast<microseconds>(end1-begin1);
std::cout << "Vector 1 approach took " << ticks1.count() << " microseconds.\n";
std::cout << "Number of common indices: " << match_index_2.size() << "\n";
}
{
auto begin1 = high_resolution_clock::now();
// Solve problem -------------------------------------------
std::vector<int> new_vec_1(random_vec_1);
std::vector<int> new_vec_2(random_vec_2);
std::sort(std::begin(new_vec_1), std::end(new_vec_1));
std::sort(std::begin(new_vec_2), std::end(new_vec_2));
std::vector<size_t> match_index_2;
match_index_2.reserve(random_vec_2.size());
for (auto it1 = new_vec_1.begin(), it2 = new_vec_2.begin();
it1 != new_vec_1.end() && it2 != new_vec_2.end();
++it2) {
while (it1 != new_vec_1.end() && *it1 < *it2) ++it1;
if (it1 != new_vec_1.end() && *it1 == *it2) {
match_index_2.push_back(it2 - new_vec_2.begin());
}
}
// ---------------------------------------------------------
auto end1 = high_resolution_clock::now();
auto ticks1 = duration_cast<microseconds>(end1-begin1);
std::cout << "Vector 2 approach took " << ticks1.count() << " microseconds.\n";
std::cout << "Number of common indices: " << match_index_2.size() << "\n";
}
{
auto begin1 = high_resolution_clock::now();
// Solve problem -------------------------------------------
std::unordered_set<int> my_set;
std::vector<size_t> match_index_2;
for (size_t i = 0u; i < random_vec_1.size(); ++i) {
my_set.insert(random_vec_1[i]);
}
for (size_t i = 0u; i < random_vec_2.size(); ++i) {
if (my_set.count(random_vec_2[i]) == 1u)
match_index_2.push_back(i);
}
// ---------------------------------------------------------
auto end1 = high_resolution_clock::now();
auto ticks1 = duration_cast<microseconds>(end1-begin1);
std::cout << "Set approach took " << ticks1.count() << " microseconds.\n";
std::cout << "Number of common indices: " << match_index_2.size() << "\n";
}
}