C++ 为什么不';std算法将迭代次数作为一个参数
假设我有一个列表的迭代器,我想对列表中接下来的N个元素应用一个算法。如果我想使用算法,我要么编写自己的for循环,要么使用C++ 为什么不';std算法将迭代次数作为一个参数,c++,C++,假设我有一个列表的迭代器,我想对列表中接下来的N个元素应用一个算法。如果我想使用算法,我要么编写自己的for循环,要么使用std::advance,但这会增加开销 为什么std算法没有重载,需要多次迭代才能执行,而不是一个结束指针 例如: std::list<int>::iterator it; std::list<int>::iterator out; // desirable but not possible std::copy(it, 5, out); // d
std::advance
,但这会增加开销
为什么std算法没有重载,需要多次迭代才能执行,而不是一个结束指针
例如:
std::list<int>::iterator it;
std::list<int>::iterator out;
// desirable but not possible
std::copy(it, 5, out);
// defeats the point of algorithms to replace common loops
for (size_t i = 0; i != 5; ++i)
{
*out++ = *it++;
}
// unnecessary overhead
std::copy(it, std::advance(it, 5), out);
std::list::iterator;
std::list::迭代器输出;
//可取但不可能
std::复制(it、5、out);
//克服了算法的局限性,从而取代了常见的循环
对于(尺寸i=0;i!=5;++i)
{
*out++=*it++;
}
//不必要的开销
标准::复制(it,标准::前进(it,5),输出);
因为范围是由迭代器指定的,迭代器可以通过算术运算形成,例如
f(it, it + 5);
虽然在某些情况下(例如,
list
)指定迭代次数可能更便宜,但将迭代器和迭代计数组合在可能紧密的循环中会带来性能成本,并且会创建一个程序员通常更容易超出容器末尾的场景
vector<int> v { 1, 2, 3 };
for_each_eg(v, 4, [](int i) { cout << i; });
Vs
不卖这么多的想法,但是考虑第二个如何容易适应:
f(v.rbegin(), v.rend());
我把它作为一个练习留给读者,让他们思考如何使用第一个语法来实现它。有些是这样做的,比如
std::copy\n
@jrok-Doh!好的,这只是一个例子,那么std::for_each
呢?为什么std::for_each
首先需要迭代次数?这不是常规for循环应该用于的吗?此外,还可以将正则数组传递给for-each。。每个人都有自己的目的。。for range、for each、for。@cantchoosesernames当然std::for_each
需要知道迭代次数,它只是由结束迭代器间接接收。如果我只想调用容器子集上的函数呢?你可以使用指针吗<代码>标准::for_each(&some_container[index],&some_container[someotherindex],](type var){……})另外,我认为他想要f(v.rbegin(),v.size())
,这会使你的样本无效。更好的示例应该是std::istream\u迭代器(std::cin)
,在到达末尾之前,计数是未知的。你在kindle上这么做?!太棒了!我开始发现用Swype打字越来越直观。好。直到我试着写一篇直观的文章之前,我一直是这样想的。“将迭代器和迭代计数组合在一个可能很紧的循环中会带来性能代价”解释道?至于越界,你已经可以在很多事情上做到这一点,包括无效的迭代器,所以我不认为这是不使用它的明确原因。组合:如果你同时接受迭代器范围和迭代计数,你必须在循环开始时或每次迭代时(it!=end&&If(v.begin(), v.end());
f(v.rbegin(), v.rend());