C++ 为什么不';std算法将迭代次数作为一个参数

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

假设我有一个列表的迭代器,我想对列表中接下来的N个元素应用一个算法。如果我想使用算法,我要么编写自己的for循环,要么使用
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&&I)对两者进行测试。虽然无效迭代器是一个问题,但它们不是迭代器引入的新问题,也不是迭代器特有的问题。如果您忘记了对元素N的指针、迭代器或引用刚刚失效,那么问题不在于寻址类型,因为简单的偏移量可能也会有同样的问题。
f(v.begin(), v.end());
f(v.rbegin(), v.rend());