Hej.
Hade tentamen i fredags och fastnade p en uppgift som jag sedan frskt lsa, men jag lyckas inte helt.
Mycket eftersom jag inte verkar frst helt hur iteratorer kan anvndas.
Vad som fljer r frst min funktion, "rovarsprak" och sedan main som testar min funktion.
Min funktion tar 3 argument. iterator.begin(), iterator.end) samt en 3:e iterator?. I frsta fallet en back_insterter.
back_inserter som jag frstr fungerar genom att man skickar med den som en referens och skriver till den i sin funktion, men den skriver vidare till en strng som deklarerats i main.
I andra testet blir jag osker. Jag frstr inte helt vad den ska testa. Vilken distance r det frgan om?
Hr hnger jag inte riktigt med.
Hade tentamen i fredags och fastnade p en uppgift som jag sedan frskt lsa, men jag lyckas inte helt.
Mycket eftersom jag inte verkar frst helt hur iteratorer kan anvndas.
Vad som fljer r frst min funktion, "rovarsprak" och sedan main som testar min funktion.
Min funktion tar 3 argument. iterator.begin(), iterator.end) samt en 3:e iterator?. I frsta fallet en back_insterter.
back_inserter som jag frstr fungerar genom att man skickar med den som en referens och skriver till den i sin funktion, men den skriver vidare till en strng som deklarerats i main.
I andra testet blir jag osker. Jag frstr inte helt vad den ska testa. Vilken distance r det frgan om?
Hr hnger jag inte riktigt med.
Kod:
#include <iterator> #include <vector> #include <string> #include <iostream> using std::cout; using std::endl; bool isvowel(char ch) { return (ch == 'a') || (ch == 'e') || (ch == 'i') || (ch == 'o') || (ch == 'u'); } template <class It, class T> T rovarsprak( It first, It last, const T &value ) { std::vector<char> rovStr; // create a temporary char vector to hold the string, converted to rovarspraket while( first != last ) { // check to see if it's alphanumerical(ie a character) NOT a vowel. Then it must be a konsonant if(isalpha(*first) && !isvowel( (char)tolower(*first) ) ){ rovStr.push_back(*first); rovStr.push_back('o'); rovStr.push_back(*first); } else{ rovStr.push_back(*first); } ++first; } std::copy(rovStr.begin(), rovStr.end(), value); // copy all characters to value reference return value; } bool print_and_check(const std::string& s, const std::string& r) { std::string r1; auto i1 = std::back_inserter(r1); rovarsprak(s.begin(), s.end(), i1); auto success = true; cout << s << " --> " << r1 << endl; if (r1 != r) { cout << "*** expected: " << r << endl; success = false; } return success; } int main() { // first test print_and_check("Test!", "ToTesostot!"); print_and_check("ABBA", "ABoBBoBA"); print_and_check("A secret message", "A sosecocroretot momesossosagoge"); print_and_check("1234", "1234"); // second test std::vector<char> v{'T', 'e', 's', 't', 'i', 'n', 'g', ',', ' ', 't', 'e', 's', 't', 'i', 'n', 'g', ' ', '1', '2', '3',}; std::string exp = "ToTesostotinongog, totesostotinongog 123"; // 40 characters long const auto sz = exp.size(); // 40 std::vector<char> res(sz+50); // char vector 40+50 = 90 elements large auto it = rovarsprak(v.begin(), v.end(), res.begin()); // res.erase(it, res.end()); for (auto x : res) { cout << x; } cout << "\n"; if(it != res.begin() + static_cast<std::vector<char>::difference_type>(sz)){ auto d = std::distance(res.begin(), it); cout << "*** wrong value of returned iterator. Distance was: " << d << ", expected " << sz << ".\n"; } auto eq = std::equal(exp.begin(), exp.end(), res.begin()); if(!eq){ cout << "*** expected " << exp << "\ngot " << std::string(res.begin(), res.end()) << "\n"; } }