C++ 将向量引用复制到另一个向量引用

C++ 将向量引用复制到另一个向量引用,c++,vector,reference,copy,structure,C++,Vector,Reference,Copy,Structure,我有一个结构,比如SubscriptionData。该类型的两个变量在函数1中声明 SubscriptionData aSubscriptionData; SubscriptionData aResultSubscriptionData; 结构本身有另一个结构,而另一个结构又有另一个结构的向量。向量如下所示 aSubscriptionData.apn_config_file.apn_config 我已经正确初始化了结构。现在,我调用一个函数来填充aSubscriptionData。然后我调用

我有一个结构,比如SubscriptionData。该类型的两个变量在函数1中声明

SubscriptionData aSubscriptionData;
SubscriptionData aResultSubscriptionData;
结构本身有另一个结构,而另一个结构又有另一个结构的向量。向量如下所示

aSubscriptionData.apn_config_file.apn_config
我已经正确初始化了结构。现在,我调用一个函数来填充aSubscriptionData。然后我调用另一个函数,其原型如下所示

void breakSubDataLen(ImsMsg::SubscriptionData& aSubscriptionData, ImsMsg::SubscriptionData& aResultSubscriptionData);
在函数breakSubDataLen()中,我应该将元素从AsSubscriptionData.begin()+3复制到AsSubscriptionData.end(),复制到结构aResultSubscriptionData

我正在为此做以下操作

std::copy(aSubscriptionData.apn_config_file.apn_config.begin() + 3, 
    aSubscriptionData.apn_config_file.apn_config.end(),
    aResultSubscriptionData.apn_config_file.apn_config.begin());

它似乎不起作用。有人能帮我吗?

std::copy
不分配元素;必须确保目标区域中有足够的空间容纳源区域中的所有元素

一种常见的方法是使用
std::back\u inserter
,它调用
push\u back
将每个元素插入到容器中:

std::copy(source.begin(), source.end(), std::back_inserter(destination));
另一种常见的方法是使用
resize
在目标序列中预先分配足够的空间:

destination.resize(std::distance(source.begin(), source.end()));
std::copy(source.begin(), source.end(), destination.begin());
当然,这两种方法有不同的行为。使用
std::back\u inserter
,将保留序列中的任何元素,并在现有元素之后插入新元素。使用
resize
方法,将覆盖任何现有元素。您还可以使用
调整大小
方法并保留任何现有元素:

const std::size_t original_size = destination.size();
destination.resize(destination.size() + 
                   std::distance(source.begin(), source.end());

std::copy(source.begin(), source.end(), destination.begin() + original_size);

(这要求
destination
是一个随机可访问的容器,如
std::vector
;如果不是,则必须相应地修改代码。)

std::copy
不分配元素;必须确保目标区域中有足够的空间容纳源区域中的所有元素

一种常见的方法是使用
std::back\u inserter
,它调用
push\u back
将每个元素插入到容器中:

std::copy(source.begin(), source.end(), std::back_inserter(destination));
另一种常见的方法是使用
resize
在目标序列中预先分配足够的空间:

destination.resize(std::distance(source.begin(), source.end()));
std::copy(source.begin(), source.end(), destination.begin());
当然,这两种方法有不同的行为。使用
std::back\u inserter
,将保留序列中的任何元素,并在现有元素之后插入新元素。使用
resize
方法,将覆盖任何现有元素。您还可以使用
调整大小
方法并保留任何现有元素:

const std::size_t original_size = destination.size();
destination.resize(destination.size() + 
                   std::distance(source.begin(), source.end());

std::copy(source.begin(), source.end(), destination.begin() + original_size);

(这要求
destination
是一个随机可访问的容器,如
std::vector
;如果不是,则必须相应地修改代码。)

通过将
aResultSubscriptionData.apn_config_file.apn_config.begin()
作为
std::copy
的第三个参数传递
,您告诉它您已经为它分配了足够的空间来分配从
.begin()
开始的元素。如果向量中有0个元素,那么显然
.begin()
.begin()+X
没有引用有效的迭代器。如果向量已经包含了足够多的元素,或者如果调整了大小,则可以将元素复制到新向量中

更可能的是,您要使用的是
vector
s范围插入。我相信这样会更有效率:

aResultSubscriptionData.apn_config_file.apn_config.insert(0, aSubscriptionData.apn_config_file.apn_config.begin() + 3, aSubscriptionData.apn_config_file.apn_config.end());

通过将
aResultSubscriptionData.apn\u config\u file.apn\u config.begin()
作为第三个参数传递给
std::copy
,您告诉它您已经为它分配了足够的空间来分配从
开始的元素。如果向量中有0个元素,那么显然
.begin()
.begin()+X
没有引用有效的迭代器。如果向量已经包含了足够多的元素,或者如果调整了大小,则可以将元素复制到新向量中

更可能的是,您要使用的是
vector
s范围插入。我相信这样会更有效率:

aResultSubscriptionData.apn_config_file.apn_config.insert(0, aSubscriptionData.apn_config_file.apn_config.begin() + 3, aSubscriptionData.apn_config_file.apn_config.end());


很抱歉,这里的代码片段错误。实际行是std::copy(aSubscriptionData.apn_config_file.apn_config.begin()+3,aSubscriptionData.apn_config_file.apn_config.end(),aResultSubscriptionData.apn_config_file.apn_config.begin());给你修好了。顺便说一句,
apn_config
是一个
std::vector
,对吗?“它似乎不起作用”是一个模糊的问题描述。是的。。apn_config是一个std::vector。我正在尝试你的解决方案。成功@詹姆斯:谢谢你,伙计!很抱歉,这里的代码片段错误。实际行是std::copy(aSubscriptionData.apn_config_file.apn_config.begin()+3,aSubscriptionData.apn_config_file.apn_config.end(),aResultSubscriptionData.apn_config_file.apn_config.begin());给你修好了。顺便说一句,
apn_config
是一个
std::vector
,对吗?“它似乎不起作用”是一个模糊的问题描述。是的。。apn_config是一个std::vector。我正在尝试你的解决方案。成功@詹姆斯:谢谢你,伙计!
resize
方法也会对输入进行两次迭代,这可能会影响迭代是否有副作用,比如消耗非查找文件中的数据。@Mike:是的;源迭代器需要是ForwardIterator(因为OP有一个容器,所以几乎可以肯定源范围是forward iterable的)。vector的范围插入函数本质上不应该这样做,而且效率更高吗?@JaredC:是的,这肯定更干净(+1),但我不确定它是否更有效。如果源是输入计算器范围,则向量需要使用
back\u inserter
方法,或者需要累积到辅助存储器中,然后使用resize方法(我不能100%确定严格允许这种方法)。如果源代码是ForwardIterator范围,它可以直接使用resize方法。效率问题是一个有趣的问题,因为标准库实现者优化了他们认为是