繁体   English   中英

将矢量引用复制到另一个

[英]Copying a vector reference to another

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

SubscriptionData aSubscriptionData;
SubscriptionData aResultSubscriptionData;

该结构本身具有另一个结构,该结构又具有另一个结构的向量。 向量在下面给出

aSubscriptionData.apn_config_file.apn_config

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

void breakSubDataLen(ImsMsg::SubscriptionData& aSubscriptionData, ImsMsg::SubscriptionData& aResultSubscriptionData);

在功能breakSubDataLen()中,我应该将元素从aSubscriptionData.begin()+ 3复制到aSubscriptionData.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_inserter ,它调用push_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_inserter ,保留序列中的任何元素,并在现有元素之后插入新元素。 使用resize方法,所有现有元素都将被覆盖。 您还可以使用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的范围插入。 我相信这样会更有效率:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM