The following code represents a simple indexed binary search tree of integers. The insert method inserts an int. The indexed lookup looks up the ith smallest element (0 indexed). I'm trying to write C++ that is idiomatic, clean, modern, and efficient in that order. Can people give me pointers?
#include <iostream>
#include <pthread.h>
#include <type_traits>
#include <vector>
#include <algorithm>
#include <random>
using std::vector;
class IndexedBST{
public:
IndexedBST() : root(nullptr) {}
void insert(int val){
auto node = new Node(val, 1);
if(root==nullptr){
root = node;
}
else{
auto pointer = root;
Node * prev;
while(pointer!=nullptr){
++pointer->size;
prev = pointer;
if(val < pointer->key){
pointer = pointer->left;
}
else {
pointer = pointer->right;
}
}
if(prev->key>val)
prev->left = node;
else
prev->right = node;
}
}
int operator[](int i) const{
if(root==nullptr||i<0||i>=root->size)
throw std::out_of_range("Invalid index");
auto pointer = root;
while(1){
auto left{pointer->left==nullptr?0:pointer->left->size};
auto right{pointer->right==nullptr?0:pointer->right->size};
if(i<left)
pointer = pointer->left;
else if (i==left)
return pointer->key;
else{
i -= left+1;
pointer = pointer->right;
}
}
}
private:
class Node
{
public:
int key;
int size;
Node * left;
Node * right;
Node(int key, int size, Node * left = nullptr, Node * right = nullptr): key(key), size(size), left(left), right(right) {}
};
private:
Node * root;
};
int main(int argc, char * argv[]) {
vector<int> input(atoi(argv[1]), 0);
vector<int> confirm(atoi(argv[1]), 0);
for(int i=0; i<input.size(); i++){
input[i] = confirm[i] = i;
}
auto rng = std::default_random_engine {};
std::shuffle(std::begin(input), std::end(input), rng);
IndexedBST bst;
for(auto e:input)
bst.insert(e);
for(int i=0; i<input.size(); i++){
if(bst[i]!=confirm[i]){
printf("%d at %d does not match %d\n", bst[i], i, confirm[i]);
break;
}
}
printf("Checked %lu elements successfully\n", confirm.size());
}
```