Skip to content

Add Indexed Manager Snippets #125

Open
@LuchoBazz

Description

@LuchoBazz
#include <bits/stdc++.h>

using namespace std;

using Row = tuple<int, int, int>;
const int N_ELEM = 3;

const Row NONE = {-1, -1, -1};

class IndexedManager {
private:
  set<Row> tuples;
  map<int, Row> col_index[3];

public:
  void add(const Row &new_value) {
    if (tuples.insert(new_value).second) {
      col_index[0][get<0>(new_value)] = new_value;
      col_index[1][get<1>(new_value)] = new_value;
      col_index[2][get<2>(new_value)] = new_value;
    }
  }

  Row find(int column, int value) {
    assert(1 <= column && column <= N_ELEM);

    auto &index = col_index[column - 1];
    auto it = index.find(value);

    if (it != index.end()) {
      return it->second;
    }
    return NONE;
  }

  Row del(int column, int value) {
    assert(1 <= column && column <= N_ELEM);

    auto &index = col_index[column - 1];
    auto it = index.find(value);

    if (it != index.end()) {
      Row tupleToRemove = it->second;
      tuples.erase(tupleToRemove);

      col_index[0].erase(get<0>(tupleToRemove));
      col_index[1].erase(get<1>(tupleToRemove));
      col_index[2].erase(get<2>(tupleToRemove));

      return tupleToRemove;
    }
    return NONE;
  }
};

void print_im(const Row &tp) {
  cout << "(" << get<0>(tp) << ", " << get<1>(tp) << ", " << get<2>(tp) << ")"
       << '\n';
}

int main() {
  IndexedManager im;
  im.add(make_tuple(1, 20, 36));
  im.add(make_tuple(2, 2, 33));
  im.add(make_tuple(3, 32, 32));
  im.add(make_tuple(4, 222, 23));
  im.add(make_tuple(5, 23, 563));
  im.add(make_tuple(7, 232, 456));

  auto r1 = im.find(1, 1);
  print_im(r1);
  auto r2 = im.del(2, 20);
  print_im(r2);
  auto r3 = im.find(1, 1);
  print_im(r3);

  return 0;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions