如何使用std :: copy将给定范围的向量正确复制到另一个向量?

时间:2019-03-27 15:47:27

标签: c++98 mbed

我发现了将向量范围移动到另一个向量的几页,但是我正在努力使其工作。

我想将元素从sourceVect移到destVect,将sourceVect[1]sourceVect[1+numToCopy]之间的元素移到sourceVect的开头。我尝试通过以下方式进行此操作:

vector<int> destVect;
vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
int numToCopy = 7;

vector<int>::iterator itSource = sourceVect.begin();
vector<int>::iterator itSourceEnd = sourceVect.begin();
advance(itSource, 1);
advance(itSourceEnd, 1+numToCopy);

std::copy(itSource, itSourceEnd, destVect.begin());             //copy(first,last,output vector ite)


for (vector<int>::iterator it = destVect.begin(); it != destVect.end(); ++it)
    cout << ' ' << *it;

但是我收到调试声明失败,向量迭代器+偏移超出Visual Studio的范围。请注意,我只是在Visual Studio 2015中进行尝试,最后必须在C ++ 98中实现mbed,这意味着我不能使用std::next

2 个答案:

答案 0 :(得分:1)

std::copy()不会在目标容器中创建新元素。这意味着您需要创建正确大小的destVect

vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
vector<int> destVect(sourceVect.size() - 1);

如果无法使用正确的尺寸创建它,请稍后在您知道尺寸的位置重新调整尺寸:

destVect.resize(sourceVect.size() - 1);

您现在可以复制:

copy(sourceVect.begin() + 1, sourceVect.end(), destVect.begin());

但是,您只需要创建具有正确内容的destVect。您无需手动复制任何内容:

vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
vector<int> destVect(sourceVect.begin() + 1, sourceVect.end());

这是最快的方法,而且(也许更重要的是)它不容易出错。如果执行std::copy,但目标容器的大小不够大,则最终将写入未分配的内存中(缓冲区溢出。)

答案 1 :(得分:1)

<div class="box-body table-responsive"> <table id="Slider_table" class="table table-bordered table-hover"> <thead> <tr> <th>ID</th> <th>Title</th> <th>item_Price</th> <th>Description</th> <th>Status</th> <th>Action</th> </tr> </thead> <tbody> </tbody> </table> </div><!-- /.box-body --> 一直支持$(document).ready(function() { $("#Slider_table").dataTable( { "bProcessing": true, "bServerSide": true, "sAjaxDataProp": "data", "fnServerData": function(sSource, aoData, fnCallback){ $.ajax({ "dataType": "json", "type" : "POST", "url" : "'.base_url().'Home/items_list/list", "data" : aoData, "success" : function(res){ fnCallback(res); } }); } }); }); ,您不需要vector::iterator+。最简单的方法是从一对迭代器进行初始化。

next

如果您无法避免将advance的声明延迟到拥有合适的初始化程序的地步,可以使用 std::vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; std::vector<int>::iterator first = sourceVect.begin() + 1; std::vector<int>::iterator last = first + numToCopy; std::vector<int> destVect(first, last); // contains 2,3,4,5,6,7,8

destVect