从地图值中的unique_ptr迭代原始指针
Iterate raw pointers from unique_ptr in map values
我在地图值中使用unique_ptr。我需要将这些值作为原始指针的列表/向量获取。到目前为止,我已经做了如下工作。
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <map>
class Foo {
public:
std::string val;
Foo(std::string v) : val(v) {
}
};
class Unique {
public:
std::map<int, std::unique_ptr<Foo>> unique_map;
std::vector<Foo*> getFoos() {
std::vector<Foo*> foos;
for (auto& it : unique_map) {
foos.push_back(it.second.get());
}
return foos;
}
};
int main() {
Unique unique;
Foo* f1 = new Foo("1");
Foo* f2 = new Foo("2");
unique.unique_map.emplace(1, f1);
unique.unique_map.emplace(2, f2);
std::vector<Foo*> foos = unique.getFoos();
for (Foo* foo : foos) {
std::cout << foo->val;
}
std::cout<<"n";
return 0;
}
但这无法编译。最相关的错误消息似乎是
"/usr/include/c++/4.8/bits/stl_tree.h:140:49:注意:无法转换 'std::forward((* & __args#1))' (键入 'Foo*') 以键入 'const 标准::unique_ptr&'"
但我不确定我是否理解它的含义,因为我的理解是 it.second 返回对unique_ptr的引用,而不是它自己假设的 Foo 实例,这就是问题所在。需要做些什么来修复此示例?
编辑我使用的是较旧的g ++版本。
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
使用命令行。
g++ -std=c++11 -o unique unique.cpp
您遇到的错误是因为不允许将Foo*
隐式转换为std::unique_ptr<Foo>
。这是因为,获取原始指针的unique_ptr
构造函数标记为 explicit
。
explicit
unique_ptr(pointer __p) noexcept
: _M_t(__p, deleter_type())
{ static_assert(!is_pointer<deleter_type>::value,
"constructed with null function pointer deleter"); }
因此,您应该创建一个unique_ptr
并在执行emplace
时对其进行move
注意:我不确定它为什么或如何在 g++> 6.0 库中工作。但我个人认为将原始指针隐式转换为智能指针是不安全的。要了解原因,请参阅:https://stackoverflow.com/a/11367997/434233
当我运行此代码时,投诉似乎与std::pair
类的创建有关。
unique.unique_map.emplace(1, std::unique_ptr<Foo>(f1));
unique.unique_map.emplace(2, std::unique_ptr<Foo>(f2));
对我来说,这是构建和有效的,并不是说我可以肯定地说它真的会做你想要的。只是它为我编译和运行。
我C++大部分时间都在使用 QT 库和类,但是,在我看来,它未能找到一种方法将一对带有FOO*
的unique_ptr<FOO>
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 实现一个在集合上迭代的模板函数
- 对于set上的循环-获取next元素迭代器
- 在向量内的向量上迭代
- 为什么output_editor Concept不需要output_e迭代器标记
- TSP递归解的迭代形式
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器