c++ - C++ 中的容器和运算符

标签 c++ stl operator-overloading

我被要求实现一个返回集合的简单算法。 它接收一个(STL 的)容器和一个实现二元 () 运算符的对象。该运算符接收两个容器并返回一个 bool 值。返回的集合将包含原始容器中遵循某些规则的每个元素。 所以我的算法如下所示:

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 的 vector 发送到该算法。

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) {

Demo

关于c++ - C++ 中的容器和运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41743544/

相关文章:

c++ - struct 定义中的 typedef 用法

c++ - 如何将 recursive_directory_iterator 与算法库一起使用,尤其是 std::remove_if?

C++ 数组下标运算符模板

C++ 用户定义的运算符 < 无法正常工作

c++ - 比较 boost::optional<T&> 和 const T&

c++ - C/C++ 是否提供最短执行时间的任何保证?

c++ - 如何创建一个结构并同时对其进行初始化?

c# - 无法编码(marshal) 'return value' : Invalid managed/unmanaged type combination

c++ - 在 C++ 中将输入直接输入到 vector 中

C++ STL : Passing an empty container to lower_bound