Templates C++ Code Organisation: Task 2. Censorship
Колеги, поствам си кода, който дава 100 / 100, но бих искал да попитам дали е възможно да бъде написан по-прегледно, защото ми се струва, че достъпа до Iterator, Set и Vector може да бъде по-добре. Вие как сте го направили?
#include "pch.h"
#include "Article13Filter.h"
Article13Filter::Article13Filter(std::set<std::string> copyrighted) : copyrighted(copyrighted) {}
bool Article13Filter::blockIfCopyrighted(std::string s) {
if (isCopyrighted(s)) {
Article13Filter::blocked.push_back(s);
return true;
}
else
return false;
}
bool Article13Filter::isCopyrighted(std::string s) {
std::set<std::string>::iterator it = Article13Filter::copyrighted.begin();
bool isIn;
while (it != Article13Filter::copyrighted.end())
{
if (*it == s)
{
isIn = true;
break;
}
else
isIn = false;
++it;
}
return isIn;
}
std::vector<std::string> Article13Filter::getBlocked() {
return Article13Filter::blocked;
}
Понеже търсим в std::set, а сет-а съдържа само уникални елементи, е достатъчно:
bool Article13Filter::blockIfCopyrighted(std::string s){
if(copyrighted.count(s)){
blocked.push_back(s);
return true;
}
return false;
}
Функцията bool isCopyrighted(std::string s) не я ползвам изобщо и съм я оставил dummy, но нищо не пречи да се навърже и тя, ако така ще се счете за грешка или недокомплектовано.
Мдаа, оригинално, не се бях сетила за това!
И да не върви заради скелета, все едно - хубаво решение е! Поздравления, колега ditchev!!!
В тази задача спокойно може да използваш count() или binary_search() вместо find(). Времето за изпълнение е едно и също. Въпреки това, кода по-лесно се чете и се разбира какво правиш ако използваш find(). +1 от мен.
Благодаря, колежке :))
Но, както каза kolioi, признавам, ...find() != ...end() е по-интуитивен от хуманоидна гледна точка:))