C++ 中的容器和运算符
containers and operators in c++
我被要求实现一个简单的算法,它返回一个集合。它接收一个容器(stl)和一个实现二进制()操作器的对象。此运算符接收两个容器并返回一个布尔值。返回的集合将包含遵循一些规则的原始容器的每个元素。所以我的算法看起来像这样:
template<typename Container, typename T, typename Object>
std::set<T> algo(Container<T>& con, Object obj) {
std::set<T> out;
std::vector<T> one;
std::vector<T> two;
bool flag_passed_x = false;
for (typename Container::iterator i = con.begin(); i != con.end(); ++i) {
one.clear();
two.clear();
for (typename Container::iterator j = con.begin(); j != con.end();
++j) {
// split the container
if (i == j)
flag_passed_x = true;
if (!flag_passed_x)
one.insert(*j);
else
two.insert(*j);
}
if (obj(one, two)) {
out.insert(*i);
}
}
return out;
}
我还尝试了实现测试,通过创建实现运算符 () 的类 Kuku 并向包含数字 0-9 的算法发送一个向量。
template<typename Container>
class Kuku {
bool operator()(const Container& low, const Container& high) {
for(typename Container::iterator i = low.begin(); i != low.end(); ++i) {
for(typename Container::iterator j = high.begin(); j != high.end(); ++j) {
if ((int) *j > (int) *i)
return false;
}
}
return true;
}
};
尝试用以下命令调用它:
int main(){
std::vector<int> v;
Kuku<std::vector<int>> kik;
for (int i = 0; i < 10; i++)
v.push_back(i);
line 58 ---> std::set<int> a = algo(v, kik);
return 0;
}
但是我遇到了无法摆脱的错误:
Description Resource Path Location Type
no matching function for call to 'algo(std::vector<int>&, Kuku<std::vector<int> >&)' a.cpp /dry4 line 58 C/C++ Problem
Description Resource Path Location Type
Invalid arguments '
Candidates are:
std::set<#1,std::less<#1>,std::allocator<#1>> algo(#0 &, #2)
' a.cpp /dry4 line 58 Semantic Error
你的代码充满了错误
您忽略了提及您实际遇到的第一个错误:
error: 'Container' is not a template
std::set<T> algo(Container<T>& con, Object obj)
您可以通过修改模板参数来解决此问题:
template<template<class...> class Container, typename T, typename Object>
std::set<T> algo(Container<T>& con, Object obj) {
接下来,您尝试使用值insert
vectors
。请改用push_back
:
if (!flag_passed_x)
one.push_back(*j);
else
two.push_back(*j);
接下来,您的Container
有一个不完整的迭代器声明。您需要将其限定为Container<T>::iterator
for (typename Container<T>::iterator i = con.begin(); i != con.end(); ++i) {
// ...
for (typename Container<T>::iterator j = con.begin(); j != con.end();
接下来,不要将Kuku
的operator()
公开:
template<typename Container>
class Kuku {
public:
bool operator()
接下来,您无意中尝试从const
容器而不是const_iterator
中获取普通迭代器:
for(typename Container::const_iterator i = low.begin(); i != low.end(); ++i) {
for(typename Container::const_iterator j = high.begin(); j != high.end(); ++j) {
演示
我认为你的问题是:
template<typename Container, typename T, typename Object>
std::set<T> algo(Container<T>& con, Object obj) {
它应该是:
template<typename Container, typename T, typename Object>
std::set<T> algo(Container& con, Object obj) {
不要试图Container
成为类模板(无论如何,这不是将类模板声明为参数的方式)。 让它成为一个简单的类(很可能从模板生成)。 特殊的问题是std::vector
没有一个模板参数 - 它至少有两个(T 和分配器),并且(至少在旧版本的 C++ 中)可能有特定于实现的附加参数。 (我不知道他们是否在标准的更高版本中删除了它。
如果你真的想Container
成为一个类模板,那么它需要:
template<
template<typename T1, class Allocator = std::allocator<T1>> typename Container,
typename T,
typename Object>
std::set<T> algo(Container<T>& con, Object obj) {
顺便说一句,我认为您的循环可以简化为:
for (auto i = con.begin(); i != con.end(); ++i) {
const std::vector<T> one(con.begin(), i);
const std::vector<T> two(i, con.end());
if (obj(one, two)) {
out.insert(*i);
}
}
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 如何防止clang格式在流运算符调用之间添加换行符<<