gpt4 book ai didi

c++ - 在没有 const_iterator 的情况下使用 boost_foreach

转载 作者:太空宇宙 更新时间:2023-11-04 12:17:22 24 4
gpt4 key购买 nike

有没有办法在不定义 const_iterator 的情况下使用 boost foreach?

我的用例是 vector 的迭代器,它可以包含无效元素。迭代器应该遍历 vector ,并且只产生有效的元素。它还应该修复 vector ,因为它应该将每个无效项目与下一个有效项目交换,并在最后调整 vector 的大小。例如,如果 -1 表示无效值,则 vector [6,-1,-1,9,-1,2] 应迭代 6,9 和 2,并将 vector 保留为 [6,9,2]。

我尝试用 boost::iterator_facade 来实现它,但我想不出一种方法来实现 const_iterator,因为 vector 可以通过删除无效值而改变,因此不能是 const

最佳答案

关注点分离:容器负责其不变量,迭代器负责遍历。如果将修复移动到容器中,则可以将逻辑 constmutable 隐藏部分分开。

您能否以“最愚蠢”的方式编写您的迭代器以将它们从容器中分离出来?例如存储一个数字索引(如果它对您的容器有意义),然后调用容器的私有(private) friend (或更多)来访问逻辑第 n 个元素。

私有(private) friend 可以在 const 上重载,并且仍然可以修改 mutable 部分来进行您描述的修复,然后返回元素。


容器支持随机访问(以及访问的数字索引)的(删节)示例:

template<typename T>
class vector {
mutable std::vector<std::weak_ptr<T>> data; // notice mutable

T&
fetch(int n);

T const&
fetch(int n) const; // notice const overload

public:
class const_iterator;
friend class const_iterator;

const_iterator
begin() const;
};

template<typename T>
class vector<T>::const_iterator {
int index;
vector<T> const* this_; // notice const
public:
// constructors go here

const_iterator&
operator++()
{ ++index; }
// ...

T const&
operator*() const
{ return this_->fetch(index); } // this will call the const version of fetch
};

// example implementation of the const version of fetch
template<typename T>
T const&
vector<T>::fetch(int n) const
{
auto removed = std::remove_if(data.begin(), data.end(), [](std::weak_ptr<T>& element)
{ return element.expired(); });
// mutate mutable data member in a logically const member
data.erase(data.begin(), removed);

// this assumes that there is no race condition
// bear with me for the sake of understanding the mutable keyword
return *data[n].lock();
}

关于c++ - 在没有 const_iterator 的情况下使用 boost_foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7049902/

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