我的问题是在下面给出以避免矢量复制中的多个副本。
#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上面使用指针;在数据回复类中,因为这些是来自libary的接口类,并且没有对它的控制而我正在调用函数,因此函数可以使用数据而范围内的数据
我的问题在上面的代码注释中给出。原因是我有数千个数据值。为了避免调用多个数据值构造函数,我想直接将数据值插入到数据回复中(即不使用itmDH局部变量)
和其他问题是
如何在数据回复中保留数据值的空间?
答案 0 :(得分:0)
使用C ++ 11,您有两个选择:
ItemDataHistory
可移动,并使用dr.GetItemDataHistories().push_back(std::move(itmDH));
emplace_back()
。答案 1 :(得分:0)
在 C ++ 11,中,您可以使用移动语义。
而不是这样做:
itmDH.GetVecDataValues().push_back(dv1);
itmDH.GetVecDataValues().push_back(dv2);
itmDH.GetVecDataValues().push_back(dv3);
你可以这样做:
itmDH.GetVecDataValues().push_back(std::move(dv1));
itmDH.GetVecDataValues().push_back(std::move(dv2));
itmDH.GetVecDataValues().push_back(std::move(dv3));
不是复制值,而是将它们简单地移动到矢量中。
而不是复制 itmDH
dr.GetItemDataHistories().push_back(itmDH);
你也可以移动它:
dr.GetItemDataHistories().push_back(std::move(itmDH));
此外,您还需要移动构造函数。这是一个例子:
DataValue(DataValue&& other){
std::cout << "DataValue move constructor called" << std::endl;
}
您也可以声明并定义移动赋值运算符:
DataValue& operator=(DataValue&& other){
std::cout << "DataValue move assigment operator is called" << std::endl;
return *this;
}
为了完全理解移动语义(以及rvalue引用),请查看以下链接:
http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html http://thbecker.net/articles/rvalue_references/section_01.html