c++ - 为什么 make_unique to vector::back() 创建另一个副本?
问题描述
在这里复制一个简单的例子来演示我的问题
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <memory>
struct Party {
Party(std::string value) : value_(value) {};
std::string value_;
};
int main() {
std::unordered_map<std::string, std::unique_ptr<Party>> map_;
std::vector<Party> parties_;
parties_.emplace_back("AAA");
parties_.emplace_back("BBB");
parties_.emplace_back("CCC");
std::unique_ptr<Party> ptr = std::make_unique<Party>(parties_.back());
ptr->value_ = "XXX";
for (auto& p : parties_) {
std::cout << p.value_ << std::endl; // print: AAA\nBBB\nCCC
}
}
本质上,我想将对象存储在向量中,并让智能指针指向它们,并使用这些指针来修改向量对象的值。
但似乎在制作 newunique_ptr
时,parties_.back()
实际上返回了对象的副本而不是原始对象。
我如何在这里实现我想要的?谢谢!
解决方案
std::make_unique<Party>(parties_.back())
总是创建一个新对象。它是std::unique_ptr<Party>(new Party(parties_.back()))
. 请注意,parties_.back()
它本身并没有复制任何东西,它返回一个引用。
在你的代码ptr
中不需要拥有Party
它的指向:parties_
已经是拥有者。只需使用引用或原始指针:
Party &lastParty = parties_.back();
lastParty.value_ = "XXX";
推荐阅读
- java - Java JsonIgnore 没有隐藏字段
- javascript - 如何将 POST WMS 请求中的 base64 图像与 ImageMapType getTileUrl 一起使用?
- cryptocurrency - 如何在 TronLink 钱包中显示我的硬币/代币的价格
- reactjs - 即使在清除严重性漏洞后也无法创建 React 应用程序
- javascript - jQuery - 无法选择第三个子元素
- mysql - 如何使用另一个表 typeorm 查询不符合条件的 id
- python - python 正则表达式:寻找正确的模式与消极的后视
- javascript - 搜索栏无法在引导程序中使用 js 脚本
- amazon-web-services - CodePipeline:提供的角色没有执行此操作的权限
- android-studio - 如何允许用户只输入一次editText并在此之后禁用它?