我一直在研究一些算法,我想知道为什么其中一些算法没有包含容器的变体。
例如,可以接收容器和值,并且算法可以通过调用容器的和来在容器find
内部迭代。与传递容器和算法使用对我来说更有用的地方相同,而不是需要一个迭代器,在那里我将被迫将数组的大小调整为最大元素数。是另一个这样的例子。begin
end
unique_copy
push_back
for_each
我确定有我不知道的充分理由吗?
我一直在研究一些算法,我想知道为什么其中一些算法没有包含容器的变体。
例如,可以接收容器和值,并且算法可以通过调用容器的和来在容器find
内部迭代。与传递容器和算法使用对我来说更有用的地方相同,而不是需要一个迭代器,在那里我将被迫将数组的大小调整为最大元素数。是另一个这样的例子。begin
end
unique_copy
push_back
for_each
我确定有我不知道的充分理由吗?
我可以看到有两个主要原因:
std::copy()
你有两个范围的东西,它们中的每一个都独立地希望被指定为范围(正确的抽象不是容器,顺便说一句,而是游侠)或一对迭代器,使其已经有 4 个重载。std::find()
which 在将迭代器作为参数时清楚地返回一个迭代器。当给定一个范围时,返回另一个范围实际上可能更合理。更糟糕的是,除非您最初只有一个通过范围(例如,从流中读取的内容),否则甚至可以选择两个不同的范围,即开始找到对象和找到对象到结束。另一个维度可能是选择获取所选范围的副本,而不是由迭代器分隔的范围。最初提出 STL 时,一开始就被认为是 Crazy Talk!试图说服人们打开另一个主要的蠕虫罐以正确处理范围可能很容易扼杀整个想法。紧接着的问题就变成了:为什么没有改变?...这个问题也有两个答案:
如果要将结果放入容器而不预先分配元素,请使用插入迭代器。例如:
std::vector<int> elements;
// ...
std::vector<int> uniqueElements;
std::unique_copy(elements.begin(), elements.end(),
std::back_inserter(uniqueElements));
采用迭代器的算法是最通用的。没有什么可以阻止您创建自己的便利函数,这些函数使用适当的参数调用标准算法。