c++ - 为什么我不能对这个容器进行排序?

标签 c++ iterator

请不要介意没有插入 fnc 并且数据是硬编码的。它的主要目的是为这个容器正确实现迭代器。

//file Set.h
#pragma once

template<class T>
class Set
{
    template<class T>
    friend ostream& operator<<(ostream& out, const Set<T>& obj);
private:
    T** myData_;
    std::size_t mySize_;
    std::size_t myIndex_;
public:

    Set();
    class iterator : public std::iterator<std::random_access_iterator_tag, T*>
    {
    private:

        T** itData_;

    public:

        iterator(T** obj)
        {
            itData_ = obj;

        }

        T operator*() const
        {
            return **itData_;
        }
        /*Comparing values of two iterators*/
        bool operator<(const iterator& obj)
        {
            return **itData_ < **obj.itData_;
        }

        /*Substracting two iterators*/
        difference_type operator-(const iterator& obj)
        {
            return itData_ - obj.itData_;
        }

        /*Moving iterator backward for value*/
        iterator operator-(const int value)
        {
            return itData_ - value;
        }

        /*Adding two iterators*/
        difference_type operator+(const iterator& obj)
        {
            return itData_ + obj.itData_;
        }

        /*Moving iterator forward for value*/
        iterator operator+(const int value)
        {
            return itData_ + value;
        }

        bool operator!=(const iterator& obj)
        {
            return (itData_ != obj.itData_);
        }

        bool operator==(const iterator& obj)
        {
            return (itData_ == obj.itData_);
        }

        T** operator++()
        {
            return ++itData_;
        }

        T** operator--()
        {
            return --itData_;
        }
    };

    iterator begin() const
    {
        return myData_;
    }

    iterator end() const
    {
        return myData_ + myIndex_;
    }
};

template<class T>
ostream& operator<<(ostream& out, const Set<T>& obj)
{
    for (int i = 0;i < 3; ++i)
    {
        out << *obj.myData_[i] << "\n";
    }
    return out;
}

//file Set_impl.h
#pragma once
#include "stdafx.h"
#include "Set.h"

template<class T>
Set<T>::Set()
{
    mySize_ = 3;
    myIndex_ = 3;
    myData_ = new T*[mySize_];
    myData_[0] = new T(3);
    myData_[1] = new T(1);
    myData_[2] = new T(2);
}

//main
include "stdafx.h"
#include "Set_impl.h"

int _tmain(int argc, _TCHAR* argv[])
{
    Set<int> a;
    Set<int>::iterator beg_ = a.begin();
    Set<int>::iterator end_ = a.end();
    std::sort(beg_,end_);//WONT SORT THIS RANGE
    cin.get();
    return 0;
}

为什么 sort 不能接受这个迭代器,即使我已经提供了 sort 工作所需的所有运算符?我认为检查发生了什么的最好方法是粘贴此代码并先运行它。 谢谢

最佳答案

不幸的是,您的代码一团糟。

禁止它编译的大概是:

class iterator : public std::iterator<std::random_access_iterator_tag, T*>

这表示当您执行 *iterator 时,它会产生一个 T*。但是看看 operator* 实际返回的是什么:

T operator*() const

我可以通过将它们更改为:

class iterator : public std::iterator<std::random_access_iterator_tag, T>

T& operator*() const

(除了许多其他更改,因为 GCC 似乎不太喜欢这个)


    /*Comparing values of two iterators*/
    bool operator<(const iterator& obj)
    {
        return **itData_ < **obj.itData_;
    }

这也是错误的。它应该与operators ==!= 有关,也就是说,它不应该比较值,而是比较迭代器。 (幸运的是,我怀疑 std::sort 实际上曾经使用过这种方法。)

    T** operator++()
    {
        return ++itData_;
    }

    T** operator--()
    {
        return --itData_;
    }

这些应该返回对迭代器本身的引用(同样,返回值很可能没有被库使用)。

关于c++ - 为什么我不能对这个容器进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2701279/

相关文章:

c++ - 在 C++ 中出现 "Expression must have (pointer-to-)function type"错误

c++ - 我可以在 C++ 中按值返回数组吗?

c++ - 在哪里可以找到 C++11 类型前缀/后缀的列表?

JavaScript 无法将现有函数应用于 onkeyup

php - 带有迭代器接口(interface)的嵌套 foreach

vb.net - 控制集合和.Where?

c++ - 从宏生成和保存代码

c++ - 如何在c或c++中的消息框(图形矩形)之前存储和检索图形

java - 如何从哈希表中检索 ArrayList<String> 的键?

java - 在迭代时将项目添加到链表是否安全