emmmm。copy是从第一个开始复制的,copy_backward是从末尾开始复制的。这确实没有问题。然后如下图同一个数组用copy然后有重叠的话会导致覆盖,而copy_backward就不会覆盖,看起来确实是没有问题。
使用如下代码的时候发现并不是这回事啊
#include <iostream>
#include <math.h>
#include <string.h>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
void printf_vector(string str, vector<int> &V) //打印vector中所有的元素
{
cout << str;
for (int i = 0; i < V.size(); i++)
{
cout << V[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> V1, V2;
for (int i = 0; i < 10; i++) //V1跟V2都变成0-9
{
V1.push_back(i);
V2.push_back(i);
}
printf_vector("V1 ", V1);
printf_vector("V2 ", V2);
V1.resize(20); //resize成20,新加的自动置为零
V2.resize(20);
printf_vector("V1 ", V1);
printf_vector("V2 ", V2);
copy(V1.begin(), V1.begin() + 10, V1.begin() + 3); //前10个元素复制到begin+3位置后 顺序
copy_backward(V2.begin(), V2.begin() + 10, V2.begin() + 13); //前10个元素复制到begin+13位置前 倒序
printf_vector("V1 ", V1);
printf_vector("V2 ", V2);
system("pause");
return 0;
}
效果如下图
可见copy并没有出现覆盖啊,数据平移得好好的,跟copy_backward的效果一毛一样呀。有哪位大佬告知一下问题出在哪吗?
“copy_backward就不会覆盖”你从哪看到的?
是会覆盖,这两个函数为了适用于不同的情况,比如你拿copy来实现copy_backward同样的功能,3和13是你自己设置的例子你当然知道,且你用的vector使用的是随机访问迭代器,支持+操作,那么如果迭代器只是一个简单的双向迭代器,只支持++,--,那么你实现相同的功能是否就会变的很麻烦?
应该是跟库有关吧,就好比memcpy那样子,看这个链接memcpy函数是不是已经解决了内存重叠的问题呢?
代码是死的人是活的,用脑子想该用copy_backward就用呗,分清楚情况用对东西就行