【发布时间】:2022-11-27 06:08:10
【问题描述】:
我有一个对象映射,其中键是 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;
}
【问题讨论】:
-
看起来像不必要的优化。
-
您需要考虑生命周期和所有权。如果我调用
getKeys()然后从地图中删除一个元素,会发生什么? -
C++20 有std::views::keys,为您提供范围键的只读视图,即
std::views::keys(my_map)将允许您在地图的键上迭代和执行其他范围操作,而无需复制元素。 -
我会支持@Kevin 并问:你需要一个向量或者只是迭代键的能力?
-
好点,我本身不需要
vector。我将研究我不知道的视图事物。谢谢你。你对生命周期的看法是正确的。我可能在那里有问题。视图对此有帮助吗?
标签: c++ optimization copy clone shared-ptr