c++ - map 使用哪种形式更好

标签 c++

给定一个类 Ac 和一个映射:

std::map<std::string, Ac> ma;

以下哪种形式更好:

ma["112"] = Ac(); // (1)

Ac ac;
ma["112"] = ac;   // (2)

使用版本1有什么问题吗?

上下文中的实际代码:

struct Ac
{
    bool first;
    bool second;
};

int main()
{   
    std::map<std::string, Ac> ma;
    std::string st = "10.12";
    if (ma.find(st) == ma.end())
    {   
#if 0
        // 1
        ma["112"] = Ac();
#else            
        // 2
        Ac ac;
        ma["112"] = ac;
#endif
    }
    else
        ma[st].first = true;

    return 0;
}

最佳答案

我想您不想让成员未初始化,所以让我们提供默认的初始化程序:

struct Ac
{
    bool first = false;
    bool second = false;
};

接下来,您查找 key 的次数过于频繁。首先,您调用 find ,当找到该元素时,您调用 operator[] ,它必须再次查找该元素。而是使用从 find 返回的迭代器。

关于您的问题,最明显的区别是一个版本添加临时变量的拷贝,而另一个版本插入局部变量的拷贝。如果不需要局部变量,可以调用emplace就地构造元素:

int main()
{   
    std::map<std::string, Ac> ma;
    std::string st = "10.12";
    auto ret = ma.emplace(st,Ac{});
    if (! ret.second)
    {   
        ret.first->second.first = true;
    }
}

emplace(类似于 insert)返回一对 bool 来指示插入是否发生,以及元素的迭代器。 ret.first->second.first 可能有点令人困惑。 ret.first 是映射中元素的迭代器 ret.first->second 是该元素的 Ac 部分, ret.first->second.first 是其 first 成员。

编译器优化后,这可能与您的两个版本中的任何一个版本一样有效,但我认为当您想要插入元素时使用 emplace 更清楚,并且因为 的构造>Ac比较便宜,不查 map 就搭建临时的也不错。要真正确定什么效果更好,您需要对其进行测量。一般来说,std::unordered_map 预计会更快,因为它的元素没有根据键进行排序。

关于c++ - map 使用哪种形式更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68747201/

相关文章:

c++ - Qt去掉标题栏

c++ - for循环没有在while循环中第二次执行

C++网络简单发送和接收

c++ - 上下文共享在带有 glfw 和 glew 的 opengl 中不起作用,第二个窗口就像上下文根本不共享

python - 使用 Numpy 读取使用 C++ 数据类型生成的二进制文件

c++ - 这个 absl::StrCat 错误发生在 Abseil 还是 MSVC 中?

c++ - 这是使用 boost::asio 进行全双工通信的真实场景吗?

c++ - 在 C++ 上使用 Levensthein 算法创建多距离矩阵

c++ - 动态数组和空指针

c++ - 易于运动,编程补间,c++