通过 c++ 中的迭代器从向量中获取相邻的元素对
Get adjacent pairs of elements from vector via iterator in c++
我想遍历向量中的所有相邻对元素。例如,如果我有一个向量{1, 2, 3, 4}
,我希望我的迭代器返回以下内容:
(1, 2)
(2, 3)
(3, 4)
我知道如何使用以下方法一次迭代一个元素:
vector<int> numbers == {1, 2, 3, 4};
for (vector<int>::const_iterator it = numbers.cbegin();
words != numbers.cend();
++it)
{
cout << *it << endl;
}
但我也不知道如何获得下一个元素。
Vector 的迭代器是随机访问迭代器。你可以在迭代器上使用operator[]
来获取下一个元素,如下所示:it[1]
std::vector::iterator
几乎可以像指针一样使用。
确保更改循环的条件并在循环中使用*(it+1)
。
vector<int> numbers = {1, 2, 3, 4}; // One =, not two.
// If the vector is empty, skip the block.
if ( !numbers.empty() )
{
vector<int>::const_iterator end = numbers.cend() - 1;
for (vector<int>::const_iterator it = numbers.cbegin(); it != end; ++it) {
cout << '(' << *it << ',' << *(it+1) << ')' << endl;
}
}
工作演示。
for (auto it = numbers.cbegin(); it != numbers.end() && std::next(it) != numbers.end(); ++it)
{
cout << *it << " " << *std::next(it) << endl;
// or, abusing C++17
auto&& [first, second] = std::tie(*it, *std::next(it));
cout << first << " " << second << endl;
}
如果你真的想要一个能够产生这对的迭代器,我已经匆忙地把一个放在一起进行概念验证。请注意,它没有经过广泛测试。
用法:
for (auto&& [first, second] : AdjacentRange{numbers})
{
cout << first << " " << second << endl;
}
// or
for (auto&& pair : AdjacentRange{numbers})
{
cout << pair.first << " " << pair.second << endl;
}
实现:
template <class It>
struct AdjancetRangeIt
{
It it_;
auto operator*() const
{
return std::tie(*it_, *std::next(it_));
}
auto operator++() -> auto& { ++it_; return *this; }
auto operator!=(AdjancetRangeIt other) const { return it_ != other.it_; }
};
template <class It>
AdjancetRangeIt(It) -> AdjancetRangeIt<It>;
template <class It>
struct AdjacentRange
{
It begin_, end_;
template <class C>
AdjacentRange(C& container)
: begin_{std::begin(container)}, end_{std::end(container)}
{}
auto begin() const
{
return AdjancetRangeIt{begin_};
}
auto end() const
{
if (begin_ == end_)
return AdjancetRangeIt{end_};
else
return AdjancetRangeIt{std::prev(end_)};
}
};
template <class C>
AdjacentRange(C) -> AdjacentRange<typename C::iterator>;
您可以同时迭代两个元素:
std::vector<int> v{1,2,3,4};
for (auto l = v.begin(), r = l + 1, e = v.end(); r != e; ++l, ++r)
std::cout << '(' << *l << ", " << *r << ")n";
输出:
(1, 2) (2, 3) (3, 4)
在Wandbox中查看。
如果您需要
使用std::vector
在这种情况下,使用迭代器是无稽之谈......使用索引的一种简单方法是
for (int i=0,n=numbers.size(); i<n-1; i++) {
std::cout << '(' << numbers[i] << ", " << numbers[i+1] << ")n";
}
当然,它可以通过迭代器来完成,但它会很糟糕。
在即将到来的 C++23 中,您将能够使用 views::slide(2( 和 views::adjacent(2(。 slide(( 生成一系列范围,而 adjacent(( 生成一系列元组。例:
vector<int> ints = {1, 2, 3, 4};
auto rg = ints | views::adjacent(2);
/*{{1, 2}, {2, 3}, {3, 4}}*/
auto [value1, value2] = (ints | views::adjacent(2))[0];
//value1=1
//value2=2
相关文章:
- 对于set上的循环-获取next元素迭代器
- 在 alglib::real_1d_array 中获取元素总和的奇怪错误
- 如何在 c++ stl 中获取列表中被推回的元素的地址,在常量时间内?
- push_back通过自行创建的对象获取最后一个元素的向量
- 从自定义类获取对象向量中的 max 元素
- 从 c++ 中的链表中获取元素
- 比较它们之间的元素并获取公共值的键
- 获取指向指针的指针元素 (c++)
- CPtrList - 如何获取元素的索引?
- 如何从一个容器中获取某些元素并将其转换插入到另一个容器中?
- 获取结构 c++ 中元素的索引
- 如何获取指针数组中的元素数量?
- 在std::集中获取与给定元素最接近的元素
- 无法获取已填充堆栈<char>的顶部元素
- 检查HTML 5视频元素是否正在获取帧
- 有没有函数可以直接获取 std::vector 元素的大小?
- 从矢量的元素获取指针
- 从 /dev/sd* 元素获取 /dev/disk/by-id 元素
- 2d查找重复元素/获取索引位置并计数重复项
- 为什么来自 rvalued-stl-container 的元素获取者返回左值