我有一个期望从给定字符串中提取键值列表的函数,其中每个键/值对均由std::pair
表示,该函数具有如下所示的签名:
std::list<std::pair<string, string>> extract(const string &s)
如果我的实现看起来像:
list<pair<...>> kv_pairs;
for (....) {
kv_pairs.push_back(make_pair(k, v));
}
return kv_pairs;
1)我不希望发生任何复制,我想知道RVO / NRVO是否将应用于列表中的对以及包含它们的列表。
2)如果在这种情况下将发生复制,那么在没有复制的情况下实现此目的的替代数据结构是什么?我可以想到使用unique_ptr<unorder_map<>>
的解决方案,但就我而言,我只需要支持列表中的对的迭代即可,不需要支持通过其键查找值,因此我想避免不必要的哈希计算在插入过程中。
3)我知道RVO / NRVO是编译器相关的行为,请问有什么方法可以验证这些行为是否发生或不容易?
如果您针对至少C ++ 11进行编译,则实际上只有两种可能的结果:
两个结果都非常快,并且不会涉及复制列表结构。