diff options
Separated wordCollection count into two variable and fixed functions
1 files changed, 37 insertions, 26 deletions
| -rw-r--r-- | Year 1/Object-oriented Programming/Solutions Sem. 08/ex3/WordCollection.cpp | 63 |
diff --git a/Year 1/Object-oriented Programming/Solutions Sem. 08/ex3/WordCollection.cpp b/Year 1/Object-oriented Programming/Solutions Sem. 08/ex3/WordCollection.cpp index aa24c3a..4a375e5 100644 --- a/Year 1/Object-oriented Programming/Solutions Sem. 08/ex3/WordCollection.cpp +++ b/Year 1/Object-oriented Programming/Solutions Sem. 08/ex3/WordCollection.cpp @@ -5,35 +5,37 @@ /* Private */ void WordCollection::free() { - if(words != nullptr) delete[] words; - if(sortMap != nullptr) delete[] sortMap; + delete[] words; + delete[] sortMap; } void WordCollection::copyFrom(const WordCollection& other) { - count = other.count; + sortMapCount = other.sortMapCount; + wordsCount = other.wordsCount; length = other.length; words = new DynStr[length]; sortMap = new int[length]; - for (int i = 0; i < count; i++) { + for (int i = 0; i < length; i++) { // Must be < length, since we can have valid items outside the count range in words words[i] = other.words[i]; sortMap[i] = other.sortMap[i]; } } void WordCollection::resize() { + int oldLength = length; + if (length == 0) length = 8; else length <<= 1; DynStr* newWords = new DynStr[length]; int* newSortMap = new int[length]; - for (int i = 0; i < count; i++) { + for (int i = 0; i < oldLength; i++) { newWords[i] = words[i]; newSortMap[i] = sortMap[i]; } - - if (words != nullptr) delete[] words; - if (sortMap != nullptr) delete[] sortMap; + delete[] words; + delete[] sortMap; words = newWords; sortMap = newSortMap; @@ -41,17 +43,17 @@ void WordCollection::resize() { void WordCollection::insertSortMapIndex(int position, int value) { if (position == -1) - position = count; + position = sortMapCount; - for (int i = count; i > position; i--) + for (int i = sortMapCount; i > position; i--) sortMap[i] = sortMap[i - 1]; sortMap[position] = value; } void WordCollection::removeSortMapIndex(int position) { - for (int i = position; i <= count - 2; i++) + for (int i = position; i <= sortMapCount - 2; i++) sortMap[i] = sortMap[i + 1]; - sortMap[count - 1] = 0; + sortMap[sortMapCount - 1] = 0; } int WordCollection::findSortMapIndexWhen(int condition, const char* str) { @@ -59,7 +61,7 @@ int WordCollection::findSortMapIndexWhen(int condition, const char* str) { else if (condition > 1) condition = 1; // TODO: replace with binary search - for (int i = 0; i < count; i++) { + for (int i = 0; i < sortMapCount; i++) { int cmp = strcmp(words[sortMap[i]].get_str(), str); if (cmp > 1) cmp = 1; else if (cmp < -1) cmp = -1; @@ -75,7 +77,7 @@ int WordCollection::findSortMapIndexWhen(int condition, const char* str) { WordCollection::WordCollection() { words = nullptr; sortMap = nullptr; - count = length = 0; + sortMapCount = wordsCount = length = 0; } WordCollection::WordCollection(const WordCollection& other) { @@ -95,26 +97,32 @@ WordCollection::~WordCollection() { } WordCollection& WordCollection::operator+=(const WordCollection& other) { - for (int i = 0; i < other.count; i++) { - (*this) *= other.words[i].get_str(); + for (int i = 0; i < other.sortMapCount; i++) { + (*this) *= other.words[other.sortMap[i]].get_str(); } return *this; } WordCollection& WordCollection::operator-=(const WordCollection& other) { - for (int i = 0; i < other.count; i++) { - (*this) /= other.words[i].get_str(); + if (this != &other) { + for (int i = 0; i < other.sortMapCount; i++) { + (*this) /= other.words[other.sortMap[i]].get_str(); + } + } + else { + *this = WordCollection(); } return *this; } WordCollection& WordCollection::operator*=(const char* str) { if (!(*this)[str]) { - if (count == length) resize(); + if (sortMapCount == length || wordsCount == length) resize(); - words[count] = DynStr(str); - insertSortMapIndex(findSortMapIndexWhen(1, str), count); - count++; + words[wordsCount] = DynStr(str); + insertSortMapIndex(findSortMapIndexWhen(1, str), wordsCount); + sortMapCount++; + wordsCount++; } return *this; } @@ -124,16 +132,19 @@ WordCollection& WordCollection::operator/=(const char* str) { if (ind > -1) { words[sortMap[ind]] = DynStr(); removeSortMapIndex(ind); - count--; + sortMapCount--; } return *this; } std::ostream& operator<<(std::ostream& ostrm, const WordCollection& collection) { ostrm << "{"; - for (int i = 0; i <= collection.count - 2; i++) - ostrm << collection.words[collection.sortMap[i]].get_str() << ", "; - ostrm << collection.words[collection.sortMap[collection.count - 1]].get_str() << "}"; + if (collection.sortMapCount > 0) { + for (int i = 0; i <= collection.sortMapCount - 2; i++) + ostrm << collection.words[collection.sortMap[i]].get_str() << ", "; + ostrm << collection.words[collection.sortMap[collection.sortMapCount - 1]].get_str(); + } + ostrm << "}"; return ostrm; } |
