gpt4 book ai didi

c++ - 避免在 C++ 中的 vector 中进行多次复制

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:55 24 4
gpt4 key购买 nike

我的问题是在下面给出以避免 vector 复制中的多个拷贝。

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class DataValue {
public:

DataValue() { std::cout << "DataValue constructor called" << std::endl; }
DataValue(DataValue const& other) { cout << "DataValue copy constructor called" << std::endl; }
~DataValue() { std::cout << "DataValue destructor is called" << std::endl; }
private:

};

class ItemDataHistory {
public:
ItemDataHistory() { std::cout << "ItemDataHistory constructor called" << std::endl; }
// ItemDataHistory(ItemDataHistory const & other) { std::cout << "ItemDataHistory copy constructor called" << std::endl; }
~ItemDataHistory() { std::cout << "ItemDataHistory destructor called" << std::endl; }
std::vector<DataValue>& GetVecDataValues() { return m_vecDataValues; }

private:
std::vector<DataValue> m_vecDataValues;
};

class DataReply {
public:

DataReply() { std::cout << "Data reply constructor is called "<< std::endl; }
~DataReply() { std::cout << "Data reply destructor is called "<< std::endl; }
DataReply(const DataReply& ) { std::cout << "Data reply copy constructor is called "<< std::endl; }

std::vector<ItemDataHistory>& GetItemDataHistories() { return m_vecItemData; }

private:
// The list of DataValue
std::vector<ItemDataHistory> m_vecItemData;
};



void main()
{

DataValue dv1, dv2, dv3;
ItemDataHistory itmDH;
itmDH.GetVecDataValues().reserve(3);
itmDH.GetVecDataValues().push_back(dv1);
itmDH.GetVecDataValues().push_back(dv2);
itmDH.GetVecDataValues().push_back(dv3);

DataReply dr;
dr.GetItemDataHistories().reserve(1);
dr.GetItemDataHistories().push_back(itmDH); // Here copy consturtor of itemdatahistory is called and all data values are copied.
// Here I want to avoid data values constructor to be called again how can I avoid this
// How can I directly insert values of dv1, dv2, dv3 into "dr" with out using "itmDH"?
return;
}

注意这里我不能在上面的 std::vector m_vecItemData 中使用指针;在数据回复类中,因为这些是库中的接口(interface)类,无法控制它,我正在调用函数,因此函数可以使用数据,而数据在范围内

我的问题在上面的代码注释中给出。原因是我有数千个数据值。为了避免调用多个数据值构造函数,我想将数据值直接插入到数据回复中(即不使用 itmDH 局部变量)

其他问题是

如何在数据回复中保留数据值的空间?

最佳答案

对于 C++11,您有两个选择:

  • 使用 dr.GetItemDataHistories().push_back(std::move(itmDH)); 使您的类型 ItemDataHistory 可移动并移动您的数据(如果可能)
  • 研究容器的新成员函数,例如emplace_back() .

关于c++ - 避免在 C++ 中的 vector 中进行多次复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15287818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com