Hej.
Hade tentamen i fredags och fastnade på en uppgift som jag sedan försökt lösa, men jag lyckas inte helt.
Mycket eftersom jag inte verkar förstå helt hur iteratorer kan användas.
Vad som följer är först 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 första fallet en back_insterter.
back_inserter som jag förstår fungerar genom att man skickar med den som en referens och skriver till den i sin funktion, men den skriver vidare till en sträng som deklarerats i main.
I andra testet blir jag osäker. Jag förstår inte helt vad den ska testa. Vilken distance är det frågan om?
Här hänger jag inte riktigt med.
Hade tentamen i fredags och fastnade på en uppgift som jag sedan försökt lösa, men jag lyckas inte helt.
Mycket eftersom jag inte verkar förstå helt hur iteratorer kan användas.
Vad som följer är först 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 första fallet en back_insterter.
back_inserter som jag förstår fungerar genom att man skickar med den som en referens och skriver till den i sin funktion, men den skriver vidare till en sträng som deklarerats i main.
I andra testet blir jag osäker. Jag förstår inte helt vad den ska testa. Vilken distance är det frågan om?
Här hänger 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"; } }