gpt4 book ai didi

c++ - 使用 STL 对两个数组进行条件迭代

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:53 24 4
gpt4 key购买 nike

我有两个数组。类型是 int 和 bool。bool 数组指示元素是否已被删除。现在我想要一个返回迭代器的函数,它只迭代未删除的元素。重要的是该函数不应分配新内存(例如将元素复制到新 vector 中)。有没有办法用标准的 STL 做到这一点?

    std::array<int,5>  element={ 1   , 2   , 4    , 8    , 10   };
std::array<bool,5> deleted={ true, true, false, false, true };
std::vector<int>::iterator getNotDeleted(){
...
}

例子:

   deleted= { true, true, false, false, true };
element= { 1 , 2 , 4 , 8 , 10 };
getNotDeleted should return a std::vector<int>::iterator that Iterates over
{4,8}

最佳答案

您可以为此编写一个迭代器,只需构建一个知道两个 vector 的迭代器,以及它在两个 vector 中的当前位置。然后,在推进迭代器时,跳过任何标记为已删除的元素。

template<class T>
struct maybe_deleted_iterator {
typedef int difference_type;
typedef T value_type;
typedef T& reference;
typedef T* pointer;
typedef std::forward_iterator_tag iterator_category;

maybe_deleted_iterator();
maybe_deleted_iterator(std::vector<T>& e, std::vector<bool>& d, bool is_beginning);
maybe_deleted_iterator& operator++();
reference operator*() const;
pointer operator->() const;
bool operator==(const maybe_deleted_iterator& rhs);
bool operator!=(const maybe_deleted_iterator& rhs);
private:
std::vector<T>* elements;
std::vector<bool>* deleted;
typename std::vector<T>::iterator e_iter;
std::vector<bool>::iterator d_iter;
};

然后,简单地迭代!

int main() {
std::vector<int> element = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
std::vector<bool> deleted = {1, 0, 0, 1, 1, 0, 1, 0, 1, 1};
maybe_deleted_iterator<int> it(element, deleted, true);
maybe_deleted_iterator<int> end(element, deleted, false);
for(; it!=end; ++it) {
std::cout << *it << ' ';
}
}

http://coliru.stacked-crooked.com/view?id=40e4d1a54f71643ee9f885f82d71fb46-50d9cfc8a1d350e7409e81e87c2653ba

LeSnip3R 建议让成员成为开始/结束对,这样它就可以在任何两个容器上工作,但我认为这对于学习来说更容易理解。在实际代码中,我希望在不提及特定容器(如 vector)的情况下完成它。

关于c++ - 使用 STL 对两个数组进行条件迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16531579/

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