gpt4 book ai didi

c++ - 用于 `std::sort` 的自定义迭代器

转载 作者:行者123 更新时间:2023-11-27 23:39:58 25 4
gpt4 key购买 nike

我正在尝试创建自定义容器和迭代器。

这是我目前所拥有的:

std::array<int, 1000> global_data;

class TestVectorIterator
{
public:
TestVectorIterator()
: index(0)
{
}

TestVectorIterator(int index)
: index(index)
{
}

int& operator*()
{
return global_data[index];
}

const int& operator*() const
{
return global_data[index];
}

TestVectorIterator& operator++()
{
index++;
return *this;
}

TestVectorIterator& operator--()
{
index--;
return *this;
}

friend int operator- (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
return lhs.index - rhs.index;
}

friend int operator+ (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
return lhs.index + rhs.index;
}

friend bool operator== (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
if (rhs.index >= global_data.size())
{
return lhs.index == rhs.index;
}

return (*lhs) == (*rhs);
}

friend bool operator!= (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
if (rhs.index >= global_data.size())
{
return lhs.index != rhs.index;
}

return (*lhs) != (*rhs);
}

friend bool operator<= (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
if (rhs.index >= global_data.size())
{
return lhs.index <= rhs.index;
}

return (*lhs) <= (*rhs);
}

friend bool operator>= (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
if (rhs.index >= global_data.size())
{
return lhs.index >= rhs.index;
}

return (*lhs) >= (*rhs);
}

friend bool operator< (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
if (rhs.index >= global_data.size())
{
return lhs.index < rhs.index;
}

return (*lhs) < (*rhs);
}

using difference_type = int;
using value_type = int;
using pointer = int*;
using reference = int&;
using iterator_category = std::random_access_iterator_tag;

private:
int index = 0;
};

class TestVector
{
public:

typedef TestVectorIterator iterator;
typedef const TestVectorIterator const_iterator;

TestVector()
{
}

int size()
{
return global_data.size();
}

TestVector::iterator begin()
{
return TestVectorIterator(0);
}

TestVector::iterator end()
{
return TestVectorIterator(size());
}

TestVector::const_iterator cbegin()
{
return TestVectorIterator(0);
}

TestVector::const_iterator cend()
{
return TestVectorIterator(size());
}

int& operator[](int i)
{
return global_data[i];
}
};

它在范围 for 循环中工作正常,但在与 std::sort 一起使用时会出现编译时错误:

enter image description here

我有一段时间没有使用 C++,所以我猜我漏掉了一些简单的东西(或者做了一些完全错误的事情)。

编辑:

根据Holt的回答,编译代码如下:

std::array<int, 1000> global_data;

class TestVectorIterator
{
public:
TestVectorIterator()
: index(0)
{
}

TestVectorIterator(int index)
: index(index)
{
}

int& operator*()
{
return global_data[index];
}

const int& operator*() const
{
return global_data[index];
}

TestVectorIterator& operator++()
{
index++;
return *this;
}

TestVectorIterator& operator--()
{
index--;
return *this;
}

friend int operator- (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
return lhs.index - rhs.index;
}

friend TestVectorIterator operator-(TestVectorIterator const& lhs, int rhs)
{
return TestVectorIterator(lhs.index - rhs);
}

friend TestVectorIterator operator+(TestVectorIterator const& lhs, int rhs)
{
return TestVectorIterator(lhs.index + rhs);
}

friend TestVectorIterator operator+(int lhs, TestVectorIterator const& rhs)
{
return TestVectorIterator(lhs + rhs.index);
}

friend TestVectorIterator& operator+= (TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
lhs.index += rhs.index;
return lhs;
}

friend TestVectorIterator& operator-= (TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
lhs.index -= rhs.index;
return lhs;
}

friend bool operator== (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
if (rhs.index >= global_data.size())
{
return lhs.index == rhs.index;
}

return (*lhs) == (*rhs);
}

friend bool operator!= (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
if (rhs.index >= global_data.size())
{
return lhs.index != rhs.index;
}

return (*lhs) != (*rhs);
}

friend bool operator<= (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
if (rhs.index >= global_data.size())
{
return lhs.index <= rhs.index;
}

return (*lhs) <= (*rhs);
}

friend bool operator>= (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
if (rhs.index >= global_data.size())
{
return lhs.index >= rhs.index;
}

return (*lhs) >= (*rhs);
}

friend bool operator< (const TestVectorIterator& lhs, const TestVectorIterator& rhs)
{
if (rhs.index >= global_data.size())
{
return lhs.index < rhs.index;
}

return (*lhs) < (*rhs);
}

using difference_type = int;
using value_type = int;
using pointer = int*;
using reference = int&;
using iterator_category = std::random_access_iterator_tag;

private:
int index = 0;
};

最佳答案

为了使用std::sort , 你的迭代器必须满足 LegacyRandomAccessIterator 的要求,这意味着 LegacyBidirectionalIterator , LegacyForwardIteratorLegacyIterator .

您的 TestVectorIterator 缺少一堆重载来满足此类要求。特别是:

  • operator+(TestVectorIterator const&, TestVectorIterator const&) 没有意义,你需要 operator+(TestVectorIterator const&, int)operator+(int, TestVectorIterator const&);
  • 你需要TestVectorIterator operator-(TestVectorIterator const&, int);
  • 你需要复合运算符:+=, -=;
  • 你需要后缀递增和递减 TestVectorIterator operator++(int)TestVectorIterator operator--(int);
  • 你需要一个下标运算符int& operator[](int)

关于c++ - 用于 `std::sort` 的自定义迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55940777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com