【发布时间】:2021-03-30 06:40:35
【问题描述】:
我是一名 CS 学生,我有一个需要帮助的任务。任务是创建一个vectors_predicate_view 类,该类将T 类型作为第一个模板参数,将谓词作为第二个模板参数。在其构造函数中,该类应该获得 2 个std::vectors 作为参数。
这是课程:
#pragma once
#include <vector>
template<typename T, typename Predicate>
class vectors_predicate_view
{
private:
Predicate predict;
std::vector<T> originalContents1;
std::vector<T> originalContents2;
std::vector<T> &original1; // reference to original vector1
std::vector<T> &original2; // reference to original vector2
void setElements(std::vector<T> &vector1, std::vector<T> &vector2)
{
//Putting every element from vector1 into originalContents1
for(auto element : vector1)
originalContents1.push_back(element);
vector1.clear(); //Emptying vector1
//Putting every element from vector2 into originalContents2
for(auto element : vector2)
originalContents2.push_back(element);
vector2.clear(); //Emptying vector2
//We loop through originalContents1
//if the element gives back true for the predictatum, we add it to vector1
//else it goes to vector2
for(auto element : originalContents1)
{
if (predict(element))
vector1.push_back(element);
else
vector2.push_back(element);
}
//We loop through originalContents2
//if the element gives back true for the predictatum, we add it to vector1
for(auto element : originalContents2)
if(predict(element))
vector1.push_back(element);
}
public:
vectors_predicate_view(std::vector<T> &vector1, std::vector<T> &vector2) : original1(vector1), original2(vector2)
{
setElements(vector1, vector2);
}
};
任务是使第二个参数成为可选参数,如果没有给出,该类不应对其构造函数中的 2 个给定向量做任何事情。
只是给出一个想法,这是第二个模板的最佳外观。这是一个std::unary_function,看起来像这样:
struct is_even: std::unary_function<int, bool>
{
bool operator()(int i) const
{
return 0 == i % 2;
}
};
struct is_good_language: std::unary_function<std::string, bool>
{
bool operator()(const std::string& s) const
{
return s == "C++" || s == "C";
}
};
并像这样调用:
const vectors_predicate_view<int, is_even> va(a, b);
vectors_predicate_view<std::string, is_good_language> vb(x, y);
任何帮助将不胜感激!
【问题讨论】:
-
你应该修改传递给构造函数的向量,还是在视图中创建新的向量?此外,您需要的可能只是一个始终返回 true 的谓词。
-
@L.F.两个都。我必须更改传递给构造函数的向量并将它们在类中的原始状态复制到两个新向量中,因此当调用析构函数时,这两个向量可以根据我的 2 个新向量重置为其原始状态在类内部创建。如何确定我创建并始终返回 true 的谓词是否不是通过第二个模板的谓词?