gpt4 book ai didi

c++ - 使用迭代器向后迭代

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

为了简化我的问题,我将使用 std::string::iteratorstd::string::reverse_iterator 但问题通常是关于迭代器的。

是否有任何特殊原因需要使用以下循环向后迭代:

std::string s = "something";
for (std::string::reverse_iterator it = s.rbegin(); it != s.rend(); ++it)

而不是这个:

std::string s = "something";
std::string::iterator it = in.end();
while(it!=in.begin())
{
it--;
//do something
}

最佳答案

反向迭代器允许您重用泛型代码,因为您可以像对待普通迭代器一样对待它们,调用 ++倒退。例如:

#include <iostream>
#include <string>

template <class Iterator>
void printAll(Iterator begin, Iterator end)
{
for (auto it = begin; it != end; ++it) // ++ can mean "go backwards"
// if Iterator is a reverse
// iterator
{
std::cout << *it << "\n";
}
}

int main()
{
std::string s = "123";
printAll(s.begin(), s.end()); // prints 1, 2, 3
printAll(s.rbegin(), s.rend()); // prints 3, 2, 1
}

注意如何不需要为 printAll 编写反向版本使用 -- .

现在,考虑 <algorithm> 中的所有函数.反向迭代器的存在意味着您可以轻松地以反向方式使用所有这些迭代器。例如,有 std::copy_n , 但不是 std::reverse_copy_n ,但是对于反向迭代器,就没有必要了,因为你可以这样写:

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>

int main()
{
std::string input = "abcdef";
std::string output;
std::string output_reversed;

// copy the first 3 elements:
std::copy_n(input.begin(), 3, std::back_inserter(output));

// copy the first 3 elements going backwards, starting at the last one:
std::copy_n(input.rbegin(), 3, std::back_inserter(output_reversed));

std::cout << output << "\n"; // prints abc
std::cout << output_reversed << "\n"; // prints fed
}

对于非泛型代码,例如在您的问题中,它更像是一个样式问题,几乎没有技术上合理的论据来支持其中一个优于另一个。

关于c++ - 使用迭代器向后迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40691100/

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