得到一个矢量的地图键没有复制?



我有一个键为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返回类型。这是一种很有用的方法,可以让函数的编译器和用户知道它将返回一个特定的对象类别,而不必指定一个可能很复杂的类型。

相关内容

  • 没有找到相关文章

最新更新