सी ++ 11 के बाद से, सभी मानक कंटेनर (
std::vector
,
std::map
, आदि) समर्थन चाल अर्थ विज्ञान से
, जिसका अर्थ है कि आप अब मानक कंटेनरों को rvalues गुजरती हैं और एक प्रति बच सकते हैं: वैकल्पिक रूप से आप
// Example object class.
class object
{
private:
int m_val1;
std::string m_val2;
public:
// Constructor for object class.
object(int val1, std::string &&val2) :
m_val1(val1),
m_val2(std::move(val2))
{
}
};
std::vector<object> myList;
// #1 Copy into the vector.
object foo1(1, "foo");
myList.push_back(foo1);
// #2 Move into the vector (no copy).
object foo2(1024, "bar");
myList.push_back(std::move(foo2));
// #3 Move temporary into vector (no copy).
myList.push_back(object(453, "baz"));
// #4 Create instance of object directly inside the vector (no copy, no move).
myList.emplace_back(453, "qux");
ज्यादातर एक ही प्रभाव प्राप्त करने के लिए विभिन्न स्मार्ट संकेत का उपयोग कर सकते हैं:
std::unique_ptr
उदाहरण
std::vector<std::unique_ptr<object>> myPtrList;
// #5a unique_ptr can only ever be moved.
auto pFoo = std::make_unique<object>(1, "foo");
myPtrList.push_back(std::move(pFoo));
// #5b unique_ptr can only ever be moved.
myPtrList.push_back(std::make_unique<object>(1, "foo"));
std::shared_ptr
उदाहरण
std::vector<std::shared_ptr<object>> objectPtrList2;
// #6 shared_ptr can be used to retain a copy of the pointer and update both the vector
// value and the local copy simultaneously.
auto pFooShared = std::make_shared<object>(1, "foo");
objectPtrList2.push_back(pFooShared);
// Pointer to object stored in the vector, but pFooShared is still valid.
स्रोत
2016-11-01 10:45:57
यह सी के एक बुनियादी सिद्धांत है ++। वस्तुएं मूल्य हैं। असाइनमेंट एक प्रति बनाता है। एक ही ऑब्जेक्ट का जिक्र करने वाले दो चर संभव नहीं हैं जब तक कि आप पॉइंटर या संदर्भ बनाने के लिए '*' या '&' के साथ प्रकार को संशोधित न करें। –
@DanielEarwicker push_back वास्तव में एक संदर्भ लेता है। यह अकेले हस्ताक्षर से स्पष्ट नहीं है कि यह एक प्रतिलिपि बनायेगा। –
@ ब्रायन गॉर्डन - यह नहीं कह रहा है! इसलिए मार्गदर्शक सिद्धांत की आवश्यकता है। फिर भी, हम 'push_back' के हस्ताक्षर से कुछ घटा सकते हैं: इसमें 'const &' लेता है। या तो यह मूल्य दूर (बेकार) फेंकता है, या एक पुनर्प्राप्ति विधि है। इसलिए हम 'बैक' के हस्ताक्षर को देखते हैं, और यह सादा '&' देता है, इसलिए मूल मूल्य की प्रतिलिपि बनाई गई थी या 'कॉन्स्ट' को चुपचाप दूर कर दिया गया है (बहुत बुरा: संभावित रूप से अपरिभाषित व्यवहार)। तो मानते हैं कि 'वेक्टर' के डिजाइनर तर्कसंगत थे ('वेक्टर' नहीं) हम निष्कर्ष निकालते हैं कि यह प्रतियां बनाता है। –