C++ 在容器上双向迭代
有没有比下面的代码更好的方法,可以使用相同的迭代器在任意方向上对容器进行迭代C++ 在容器上双向迭代,c++,c++11,iterator,stdmap,C++,C++11,Iterator,Stdmap,有没有比下面的代码更好的方法,可以使用相同的迭代器在任意方向上对容器进行迭代 #include <iostream> #include <map> int main() { const bool descend = false; std::map<int, int> mapp; mapp[1] = 1; mapp[2] = 2; mapp[3] = 3; mapp[4] = 4; std::map&
#include <iostream>
#include <map>
int main()
{
const bool descend = false;
std::map<int, int> mapp;
mapp[1] = 1;
mapp[2] = 2;
mapp[3] = 3;
mapp[4] = 4;
std::map<int, int>::iterator startIter = descend ? --(mapp.end()) : mapp.begin();
std::map<int, int>::iterator endIter = descend ? --(mapp.begin()) : mapp.end();
while (startIter != endIter)
{
std::cout << startIter->first << std::endl;
descend ? --startIter : ++startIter;
}
}
#包括
#包括
int main()
{
常数布尔下降=假;
地图地图;
mapp[1]=1;
mapp[2]=2;
mapp[3]=3;
mapp[4]=4;
std::map::迭代器startIter=descent?--(mapp.end()):mapp.begin();
std::map::迭代器endIter=descent?--(mapp.begin()):mapp.end();
while(startIter!=endIter)
{
std::cout首先编写自文档代码,它就变得简单了。将该循环分解为它自己的函数,并使用适当的迭代器调用它
这就是为什么我们有“反向迭代器”,它们可以使用正常的正向语义向后遍历容器
#include <iostream>
#include <map>
template<typename I>
void printMapContainer(I begin, I end)
{
for (;begin != end; ++begin)
{
std::cout << begin->first << "\n";
}
}
int main()
{
const bool descend = false;
std::map<int, int> mapp;
mapp[1] = 1;
mapp[2] = 2;
mapp[3] = 3;
mapp[4] = 4;
if (descend) {
printMapContainer(mapp.rbegin(), mapp.rend());
}
else {
printMapContainer(mapp.begin(), mapp.end());
}
}
#包括
#包括
模板
作废printMapContainer(我开始,我结束)
{
for(;begin!=end;++begin)
{
std::cout first
有没有比下面的代码更好的方法来迭代容器
在两个方向上,使用相同的迭代器
#include <iostream>
#include <map>
int main()
{
const bool descend = false;
std::map<int, int> mapp;
mapp[1] = 1;
mapp[2] = 2;
mapp[3] = 3;
mapp[4] = 4;
std::map<int, int>::iterator startIter = descend ? --(mapp.end()) : mapp.begin();
std::map<int, int>::iterator endIter = descend ? --(mapp.begin()) : mapp.end();
while (startIter != endIter)
{
std::cout << startIter->first << std::endl;
descend ? --startIter : ++startIter;
}
}
是。使用std::map::reverse_iterator
。这将是一种比您发布的代码更好的方法,但这将不再使用相同的迭代器,这是您的要求之一
<>但是,这将比你编写的代码容易出错。除此之外,如果已经在C++中,你就不需要重新发明轮子。
#包括
#包括
模板
无效打印(常量迭代器开始,常量迭代器结束)
{
for(迭代器iter=Begin;iter!=End;++iter)
std::cout first您的代码无效,因为此语句--(mapp.begin())
导致UB。我将编写一个薄包装:
template<class Iter, class F>
void apply( Iter begin, Iter end, F f, bool forward )
{
while( begin != end )
f( forward ? *begin++ : *--end );
}
模板
无效应用(Iter开始、Iter结束、F F、bool前进)
{
while(开始!=结束)
f(前进?*开始++:*——结束);
}
或者简单地将循环重写为:
auto begin = mapp.begin();
auto end = mapp.end();
while ( begin != end)
{
const auto &p = forward ? *begin++ : *--end;
std::cout << p.first << std::endl;
}
auto begin=mapp.begin();
自动结束=mapp.end();
while(开始!=结束)
{
const auto&p=forward?*开始++:*--结束;
std::coutrbegin()
和rend()
?任何工作方式都会更好,因为这是UB:--(mapp.begin())
@Slava是真的吗?如果在开始之前没有一个,那么rend
将指向什么?@NathanOliverrend()
谁将是从begin()
以同样的方式创建的反向迭代器rbegin()
是从end()
而不是end()-1
@NathanOliver否您错了-*“返回指向当前元素之前的元素的引用或指针。”此代码不满足OP的要求“使用相同的迭代器”@Slava True。我没有想过要这样做,而是想展示一个缺少OPs要求的替代方案。好吧,现在他有了正确的答案(来自你)和一个替代方案(来自我);)有没有一种方法可以扩展它,以便我可以删除循环中的迭代器并继续循环?问题是所需的代码不同,因为erase()用于正向迭代器,因此由于模板设置而导致编译器错误。@user997112 True。然后需要将std::map
传递给模板,因为std::map::erse
需要知道映射。迭代器将无法工作。我发现的最佳解决方案是:@JeJo您的第一个链接没有引用反向迭代器第二个链接没有引用前向迭代器,因此我现在的问题是:)