Witam mam problem z dokończeniem zadania z szablonów funkcji. Problem polega na tym że nie wiem jak dokończyć 2 pierwsze funkcje i je potem wywołać oraz poprawić 3(drukującą) tak by nie wyrzucała błędów. Tu jest opis zadania:
Stwórz trzy szablony funkcji:
• Funkcja filtrująca:
template <typename T, typename FunType>
vector<T> filter(const vector<T>& v, FunType p);
która pobiera wektor v i funkcję (predykat) p pobierającą daną typu, jakiego są elementy wektora a zwracającą bool. Funkcja filter zwraca wektor tego samego typu co v i zawierający tylko te elementy wektora v, dla których predykat p zwraca true.
• Funkcja transformująca i filtrująca:
template <typename T, typename FunType1, typename FunType2>
vector<T> transfilt(vector<T>& v, FunType1 t, FunType2 p);
która pobiera wektor, funkcję transformującą t i predykat p. Wektor v (przesłany przez referencję) jest modyfikowany w ten sposób, że każdy jego element zastąpiony jest wynikiem działania na ten element funkcji transformującej. Funkcja transfilt zwraca wektor tego samego typu co v zawierający tylko te elementy przetransformowanego wektora v, dla których predykat p zwraca true.
• Funkcja drukująca:
template <typename T>
void printVec(const vector<T>& v) {
która pobiera wektor i drukuje w jednym wierszu, ujętym w nawiasy kwadratowe, jego elementy oddzielone znakami odstępu.
W wywołaniach funkcji filter i transfilt argumenty funkcyjne powinny być lambdami zdefiniowanymi bezpośrednio na liście argumentów.
Jeśli w następującym programie:
#include <cmath>
#include <iostream>
#include <functional>
#include <vector>
using std::vector;
using std::function;
template <typename T, typename FunType> vector<T> filter(const vector<T>& v, FunType p) {
// ...
}
template <typename T, typename FunType1, typename FunType2>
vector<T> transfilt(vector<T>& v, FunType1 t, FunType2 p) { // ... }
template <typename T>
void printVec(const vector<T>& v) { // ... }
int main() {
vector<int> v{1, -3, 4, -2, 6, -8, 5};
printVec(v);
vector<int> r = filter(v, /* lambda_1 */);
printVec(r);
vector<int> s = filter(v, /* lambda_2 */);
printVec(s);
vector<double> w{1.5, -3.1, 4.0, -2.0, 6.3};
printVec(w); double mn = -0.5, mx = 0.5;
vector<double> d = transfilt(w, /* lambda_3*/, /* lambda_4 */);
printVec(w);
printVec(d);
}
lambdy są
• lambda_1 — zwraca true dla liczb parzystych;
• lambda_2 — zwraca true dla liczb dodatnich;
• lambda_3 — zwraca sinus argumentu (std::sin z nagłówka cmath);
• lambda_4 — zwraca true dla liczb z zkresu [mn,mx],
to powinien on wypisać:
[ 1 -3 4 -2 6 -8 5 ]
[ 4 -2 6 -8 ]
[ 1 4 6 5 ]
[ 1.5 -3.1 4 -2 6.3 ]
[ 0.997495 -0.0415807 -0.756802 -0.909297 0.0168139 ]
[ -0.0415807 0.0168139 ]
Uwaga: nie używaj żadnych dodatkowych funkcji z biblioteki standardowej.
A tutaj jest to co ja już napisałem:
#include <cmath>
#include <iostream>
#include <functional>
#include <vector>
using std::vector;
using std::function;
using namespace::std;
template <typename T, typename FunType>
vector<T> filter(const vector<T>& v, FunType p) {
v lambda1(v a)
for (int i = 0, v.size, i++) {
if (v[i] % 2 = 0)
cout << v[i];
}
for (int i = 0, v.size, i++) {
if (v[i] >= 0)
cout << v[i];
}
}
template <typename T, typename FunType1, typename FunType2>
vector<T> transfilt(vector<T>& v, FunType1 t, FunType2 p) {
for (int i = 0, v.size, i++) {
cout << sin(v[i])
}
for (int i = 0, v.size, i++) if (v[i] <= mx && v[i] >= mn)
{
cout << v[i];
}
}
template <typename T>
void printVec(const vector<T>& v) {
int i = 0;
while (v.size() > 0)
{
cout << v[i];
cout << " ";
i += 1;
}
}
int main() {
vector<int> v{ 1, -3, 4, -2, 6, -8, 5 };
printVec(v);
vector<int> r = filter(v, lambda1);
printVec(r);
vector<int> s = filter(v, p2);
printVec(s);
vector<double> w{ 1.5, -3.1, 4.0, -2.0, 6.3 };
printVec(w);
double mn = -0.5, mx = 0.5;
vector<double> d =
transfilt(w, , );
printVec(w);
printVec(d);
}
Zdaję sobie sprawę że one nie są dobrze napisane, ale dlatego właśnie pytam się jak to powinno być, bo sam długo już próbuję to zrobić i mi nie wychodzi.