为什么不使用std算法将迭代次数作为参数

时间:2014-04-12 17:31:03

标签: 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);

// 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);

1 个答案:

答案 0 :(得分:0)

因为范围是由迭代器指定的,迭代器可以通过算术运算形成,例如

f(it, it + 5);

虽然在某些情况下指定一些迭代可能更便宜(例如list),但在可能紧密的循环中组合迭代器和迭代计数会产生性能成本,并且会创建一个场景,程序员通常更容易超过容器的末端

vector<int> v { 1, 2, 3 };
for_each_eg(v, 4, [](int i) { cout << i; });

通过这种策略,您最终会花费更多时间进行约束检查。在实践中,当坚持迭代器和范围时,首先做正确的事情通常要容易得多。

f(v, v.size());

Vs的

f(v.begin(), v.end());

没有那么多卖掉这个想法,但后来考虑第二个适应的容易程度:

f(v.rbegin(), v.rend());

我将它作为练习留给读者思考如何使用第一种语法实现这一点。