我有一个键为std::string
的对象映射。如何在不复制数据的情况下生成键向量?
我需要改变我的地图使用std::shared_ptr<std::string>
作为键代替吗?或者你能推荐点别的吗?
我现在的代码是这样的:
MyClass.h
class MyClass {
private:
std::map <std::string, MyType> my_map;
public:
const std::vector<std::string> MyClass::getKeys() const;
}
MyClass.cpp
const std::vector<std::string> MyClass::getKeys() const
{
std::vector<std::string> keys = std::vector<std::string>();
for (const auto& entry : my_map)
keys.push_back(entry.first); // Data is copied here. How can I avoid it?
return keys;
}
正如Kevin所建议的,std::views::keys基本上就是为此而设计的。它生成的视图是一个轻量级对象,只不过是一个指向range参数的指针,它解决了所有权和生命周期问题。遍历该视图与遍历映射是一样的,唯一的区别是视图的迭代器对底层映射值的第一个元素解引用。
对于一些代码,它非常简单:
// ...
#include <ranges>
class MyClass {
private:
std::map<std::string, MyType> my_map;
public:
std::ranges::view auto getKeys() const;
};
std::ranges::view auto MyClass::getKeys() const
{
return std::views::keys(my_map);
}
因为范围和概念是齐头并进的,所以我使用std::ranges::view
来约束auto
返回类型。这是一种很有用的方法,可以让函数的编译器和用户知道它将返回一个特定的对象类别,而不必指定一个可能很复杂的类型。