patterncppMinor
OrderedList class template
Viewed 0 times
orderedlistclasstemplate
Problem
I called my template
It stores a vector of values of type
Just for information, the code should be pure C++03, so please don't suggest how it could be improved with C++11/14/17 extensions, or with Boost.
OrderedList, but I don't like the name. Is there a better one?It stores a vector of values of type
T, and a map from each value to its index in the vector.Just for information, the code should be pure C++03, so please don't suggest how it could be improved with C++11/14/17 extensions, or with Boost.
template class OrderedList {
public:
typedef typename std::map MapInd;
public:
int Insert(const T& val); // insert new value, return its index
int Find(const T& val) const; // find index for the value, or -1 if not found
const T& operator[](int i) const {return vValues[i];}
int Size() const {return vValues.size();}
private:
MapInd mapIndices; // index for each element
std::vector vValues; // element for each index
};
template int OrderedList::Insert(const T& val) {
if (Size() = 0)
return ind;
ind = Size();
mapIndices[val] = ind;
vValues.push_back(val);
return ind;
}
template int OrderedList::Find(const T& val) const {
typename MapInd::const_iterator it = mapIndices.find(val);
if (it != mapIndices.end())
return it->second;
return -1;
}Solution
Name: I would call it an "Unordered Set"
You have a container that you can add items to. Duplicates are not accepted and return the index of the existing value. New values are added to the container in the order they are inserted.
Because items can be inserted in any order iterating through the container returns the values in insert order (somewhat random) so the container is not sorted in any way.
Issues: You keep two copies of each value.
There is a copy in the map and a copy in the vector. So your container uses twice as much spaces it needs too (especially for big objects).
What you have implemented looks like std::set
But it has worse space requirements.
Comparison to std::set
You have a container that you can add items to. Duplicates are not accepted and return the index of the existing value. New values are added to the container in the order they are inserted.
Because items can be inserted in any order iterating through the container returns the values in insert order (somewhat random) so the container is not sorted in any way.
Issues: You keep two copies of each value.
There is a copy in the map and a copy in the vector. So your container uses twice as much spaces it needs too (especially for big objects).
What you have implemented looks like std::set
But it has worse space requirements.
Comparison to std::set
std::set c1; OrderedList c1;
auto p1 = c1.insert(5); auto p1 = c1.Insert(5);
auto p2 = c1.insert(5); auto p2 = c1.Insert(5);
if (p1.first == p2.first) { if (p1 == p2) {
std::cout << "Equal\n"; std::cout << "Equal\n";
} }
auto p3 = c1.find(6); auto p3 = c1.find(6);
if (p3.first == c1.end()) { if (p3 == -1) {
std::cout << "Not Found\n"; std::cout << "Not Found\n"
} }
auto p4 = c1.find(5); auto p4 = c1.find(5);
if (p4 == p1.first) { if (p4 == p1) {
std::cout << "Already there\n"; std::cout << "Already there\n"
} }
std::cout << c1.size() << "\n"; std::cout << c1.Size() << "\n";
std::cout << *(p1.first) << "\n"; std::cout << c1[p1] << "\n";Code Snippets
std::set<int> c1; OrderedList c1;
auto p1 = c1.insert(5); auto p1 = c1.Insert(5);
auto p2 = c1.insert(5); auto p2 = c1.Insert(5);
if (p1.first == p2.first) { if (p1 == p2) {
std::cout << "Equal\n"; std::cout << "Equal\n";
} }
auto p3 = c1.find(6); auto p3 = c1.find(6);
if (p3.first == c1.end()) { if (p3 == -1) {
std::cout << "Not Found\n"; std::cout << "Not Found\n"
} }
auto p4 = c1.find(5); auto p4 = c1.find(5);
if (p4 == p1.first) { if (p4 == p1) {
std::cout << "Already there\n"; std::cout << "Already there\n"
} }
std::cout << c1.size() << "\n"; std::cout << c1.Size() << "\n";
std::cout << *(p1.first) << "\n"; std::cout << c1[p1] << "\n";Context
StackExchange Code Review Q#150428, answer score: 2
Revisions (0)
No revisions yet.