📜  C++ STL中的Emplace与Insert(1)

📅  最后修改于: 2023-12-03 14:39:51.815000             🧑  作者: Mango

C++ STL中的Emplace与Insert

在C++ STL中,emplaceinsert是两个常用的函数,用于向容器中添加元素。

emplace

emplace是在C++11中引入的函数,它的作用是通过调用构造函数来在容器中直接构造元素。与insert不同,emplace可以直接将元素构造在容器中,而不是通过拷贝或移动构造函数将其插入。

下面是一个示例,展示了emplace函数的用法:

#include <iostream>
#include <vector>

struct MyStruct {
    int x;
    std::string s;

    MyStruct(int x, const std::string& s) : x(x), s(s) {}
};

int main() {
    std::vector<MyStruct> vec;

    // 使用 emplace_back 直接将元素构造在容器中
    vec.emplace_back(10, "hello world");

    std::cout << vec[0].s << std::endl;

    return 0;
}

在上面的示例中,我们创建了一个自定义结构体MyStruct,然后使用emplace_back函数将元素构造在容器中。这里我们传递了两个参数,第一个参数是int类型的x,第二个参数是const std::string&类型的s,这些参数将用于调用MyStruct的构造函数。

insert

insert函数是STL中添加元素的另一个常用函数。与emplace不同,它可以使用已有的元素或值作为参数。

下面是一个示例,展示了insert函数的用法:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3};

    // 插入元素 4 到容器开始位置之前
    auto it = vec.insert(vec.begin(), 4);

    // 插入元素 5 到容器结束位置
    vec.insert(vec.end(), 5);

    // 插入元素 6 到容器的第二个位置
    vec.insert(vec.begin() + 1, 6);

    for (auto& i : vec) {
        std::cout << i << std::endl;
    }

    return 0;
}

在上面的示例中,我们创建了一个整型vector,并使用insert函数将元素插入到不同的位置。第一个插入的元素是4,它被插入到容器的开头位置。第二个插入的元素是5,它被插入到容器的结束位置。第三个插入的元素是6,它被插入到容器的第二个位置。

区别

emplaceinsert的区别在于它们添加元素的方式不同。

使用emplace时,我们直接在容器中构造元素,这可能会更加高效,因为它避免了多余的拷贝或移动操作。但是需要注意的是,我们必须传递正确的构造函数参数。

使用insert时,我们可以使用已有的元素作为参数,这样就不需要传递要构造的元素的各个构造函数参数。但是这可能会导致拷贝或移动操作,这可能会影响性能。此外,如果容器中已经有该元素,insert函数会返回一个指向该元素的迭代器,而不会添加新元素。

总结

在编写C++程序时,emplaceinsert都是非常有用的函数。它们的作用不同,使用的场景也不同,我们需要根据具体情况选择使用哪个函数。同时也要注意,为了避免不必要的数据拷贝或移动,我们应该尽量使用emplace函数。