std::remove_copy
template <class InputIterator, class OutputIterator, class T>
OutputIterator remove_copy (InputIterator first, InputIterator last,
OutputIterator result, const T& val);
复制范围删除值,复制范围中的元素 [first,last]到结果开始的范围,除了那些元素 比较等于val。输出容器必须足够大 保持结果。
Q1。 为什么输出容器的大小必须足够大才能保存结果?容器不会自行生长吗?
Q2。 为什么在执行remove_copy时输出容器中的先前内容会被覆盖?即当我执行remove_copy(a.begin(),a.end(),b.begin(),' ');
时容器b中的先前内容丢失并被新内容替换为什么会这样?为什么remove_copy的结果没有附加在输出容器的开头?
答案 0 :(得分:2)
为什么输出容器的大小必须足够大以容纳 结果?容器不会自行生长吗?
没有。怎么可能呢?所有的算法都是迭代器,你不能从它的迭代器访问容器的成员函数(这是为了扩展容器所需的)。但是,有一些特殊用途的迭代器,它们知道如何生成容器。 std::front_insert_iterator
,std::back_insert_iterator
和std::insert_iterator
,其中包含对容器的引用,并在取消引用时分别调用[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[43] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[85] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
,elas2 = function(P) {
P/(sum(u) + P)
}
dat$y2 = elas2(x)
plot(dat$x, dat$y2, type="l", lwd=2, ylim=c(0,0.4))
plot(elas2, 0, 6, lwd=2, ylim=c(0,0.4))
curve(elas2, 0, 6, lwd=2, ylim=c(0,0.4))
和push_front
分配给。
为什么输出容器中的先前内容会在i时被覆盖 执行remove_copy?
因为这就是算法的工作原理。这就是所有标准库算法的工作原理。他们对容器一无所知。并非所有迭代器都来自容器。并非所有容器都可以生长。如果要附加到容器,请使用push_back
,如上所述。您可以使用std::back_inserter
帮助程序功能方便地创建一个,而无需指定模板参数。例如:
insert
答案 1 :(得分:0)
为什么输出容器的大小必须足够大以容纳 结果?容器不会自行生长吗?
算法对序列进行操作。容器是创建序列的一种方式,但它们不是唯一的方法。所以,是的,每当你访问结束时,可以编写一个容器来增长,但序列通常不会这样做。
如果您有容器,可以使用std::inserter
创建一个输出迭代器,根据需要扩展容器。
为什么输出容器中的先前内容会在i时被覆盖 执行remove_copy?
它可能是,也可能不是,取决于输出迭代器的作用。如果它是容器中的迭代器(而不是insert_iterator),它只能访问已存在的元素,因此必须覆盖它们。如果它是输出流的迭代器,它只是将元素写入流;什么都没有被覆盖。