make_pair和大括号 { } 之间的区别,用于在C++中分配一对?
Difference between make_pair and curly brackets { } for assigning a pair in C++?
我没有找到任何人回答这个问题,以下有什么区别:
v.push_back({x, y});
和:
v.push_back(make_pair(x, y));
假设 v 是这样声明的:
vector<pair<int,int> > v;
我想你可能太快接受了这个答案。 普遍接受的方法是这样的:
vec.emplace_back (x, y);
如果你看一下Godbolt,你可以看到它内联了所有内容(这可能是你想要的,也可能不是你想要的(:
https://godbolt.org/z/aCl02d
在Wandbox上运行它:
https://wandbox.org/permlink/uo3OqlS2X4s5YpB6
法典:
#include <vector>
#include <iostream>
int x = 1;
int y = 2;
std::vector<std::pair<int,int>> vec;
int main () {
vec.push_back(std::make_pair(x, y));
std::cout << "make_pair donen";
vec.push_back({x, y});
std::cout << "push_back donen";
vec.emplace_back (x, y);
std::cout << "emplace_back donen";
for (std::pair <int, int> p : vec)
{
std::cout << p.first << ", " << p.second << "n";
}
}
输出:
make_pair done
push_back done
emplace_back done
1, 2
1, 2
1, 2
当然,如果您在预先保留矢量中适当数量的元素,一切都运行得更快。 也许这就是提出这个问题的人真正想让你说的话。
我在在线编译器中尝试过这个,据我所知,make_pair优化的程序集与 {} 语法相同。
https://godbolt.org/z/P7Ugkt
v.push_back({x, y})
中的{x, y}
是v
value_type
的聚合初始化(自C++11以来(,而std::make_pair
是一个函数,使用从其参数推导出的类型创建std::pair
。
push_back({x, y})
相对于emplace_back(x, y)
的一个优点是,你可以像这样保持小结构简单(没有构造函数(:
#include <vector>
struct A {
int x;
int y;
// A(int _x, int _y) : x{_x}, y{_y} {}
};
int f()
{
std::vector<A> v;
v.push_back({1, 2});
// v.emplace_back(1, 2); // doesn't compile unless constructor is uncommented
}
例。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- 将fold表达式与std::一起用于两个元组
- 在用于格式4的arm模拟器中实现功能时的一个问题