C++ 中的容器和运算符

containers and operators in c++

本文关键字:运算符 C++      更新时间:2023-10-16

我被要求实现一个简单的算法,它返回一个集合。它接收一个容器(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();

接下来,不要将Kukuoperator()公开:

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);
    }
}