gpt4 book ai didi

c++ - 排列值顺序的迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:40 27 4
gpt4 key购买 nike

我有一个简单的排列结构:

struct Permutation
{
vector<string> items; // ["val_0", "val_1", "val_2", "val_3", "val_4"]
vector<short> permutationValue; // Let's say value is [4, 2, 0, 1, 3]
}

我希望能够像那样在范围循环中使用它

for(string item: permutation){
{
cout << item << endl;
}

最终预期输出应该是:

val_4
val_2
val_0
val_1
val_3

我应该在 Permutation 类中实现什么方法来实现它?

最佳答案

您需要做一些工作。您需要实现自己的自定义迭代器类,并且 begin()end() :

struct Permutation
{
std::vector<std::string> items;
std::vector<short> permutationValue;

class iterator;

iterator begin();
iterator end();

};

您的迭代器类将是一个随机访问迭代器:

#include <iterator>

class Permutation::iterator : public std::iterator<std::random_access_iterator_tag, std::string>
{


};

继承自std::iterator很重要, 为了使您的自定义迭代器与 <algorithm> 一起正常工作.

有几种可能的方法来实现迭代器。但总体思路是您的迭代器将在其私有(private)类成员中存储指向其排列对象及其当前索引位置的指针:

private:
Permutation *p;
size_t pos;

它的 operator*很明显:

public:
std::string &operator*() const
{
return p->items[p->permutationValue[pos]];
}

您将需要实现所有其他迭代器运算符,递增/递减推进随机访问迭代器,运算符 ++ , -- , + , - , += , -= ,只需添加或减去 pos .

您还需要为迭代器类实现所有比较运算符:< , > , = , != , <= , 和 >= , 只需比较 pos .

这些位会有点乏味,但不可避免。

现在,您所要做的就是执行 begin()end()通过构造此迭代器实例,设置初始 pos到 0 或 items.size(); .你完成了。现在您可以使用范围迭代。

为了获得额外的分数,您还可以实现 const_iterator .

总而言之:这需要一些工作,但不是很复杂。

关于c++ - 排列值顺序的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40865140/

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