emplace

简介: emplace
class Test
{
public:
  Test(int) { cout << "Test(int)" << endl; }
  Test(int, int) { cout << "Test(int, int)" << endl; }
  Test(const Test&) { cout << "Test(const Test&)" << endl; }
  Test(Test &&) { cout << "Test(Test &&)" << endl; }
  ~Test() { cout << "~Test()" << endl; }
};
//容器的空间配置器
template<typename T>
class MyAllocator
{
  //allocate deallocate
  //construct destory
  T* allocate(size_t size)
  {
    return (T*)malloc(size * sizeof(T));
  }
  template<typename... Types>
  void construct(T* ptr, Types&&... args)
  {
    //args只是一个参数,而且是个Test对象,T也是Test类型
    new (ptr) T(std::forward<Types>(args)...);
  }
};
template<typename T, typename Alloc = MyAllocator<T>>
class vector
{
public:
  vector() : vec_(nullptr), size_(0), idx_(0) {}
  //预留内存空间
  void reserve(size_t size)
  {
    vec_ = allocator_.allocate(size);
    size_ = size;
  }
  void push_back(const T& val)
  {
    allocator_.construct(vec_ + idx_, val);
    idx_++;
  }
  void push_back(T&& val)
  {
    allocator_.construct(vec_ + idx_, std::move(val));
    idx_++;
  }
  //1.引用折叠
  template<typename... Types>
  void emplace_back(Types&&... args)
  {
    //不管是左值引用、右值引用变量,它本身是个左值。传递的过程中
    //要保持args的引用类型(左值的?右值的)类型完美转发forward
    allocator_.construct(vec_ + idx_, std::forward<Types>(args)...);
    idx_++;
  }
private:
  T* vec_;
  int size_;
  int idx_;
  Alloc allocator_;
};
int main()
{
  vector<Test> v;
  v.reserve(100);
  Test t1(10);
  cout << "============" << endl;
  //直接插入对象,两个没有区别
  v.push_back(t1);
  v.emplace_back(t1);
  cout << "============" << endl;
  v.push_back(Test(20));
  v.emplace_back(Test(20));
  cout << "============" << endl;
  v.push_back(20);
  //v.push_back(30, 40);
  cout << "============" << endl;
  //给emplace传入Test对象构造所需要的参数,直接在容器底层构造对象即可
  v.emplace_back(20);
  v.emplace_back(30, 40);
  cout << "============" << endl;
  return 0;
}
相关文章
|
搜索推荐 定位技术
免费、无版权约束、可商用的优质图片素材网站合集
免费、无版权约束、可商用的优质图片素材网站合集
942 1
|
算法 C++
小唐开始刷蓝桥(六)2015年第六届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(六)2015年第六届C/C++ B组蓝桥杯省赛真题
|
分布式计算 监控 Spark
spark 3.x Plugin Framework
spark 3.x Plugin Framework
559 0
|
监控 MySQL 关系型数据库
ProxySQL
proxysql的作用 1.读写分离,server可以进行分读组和写组 2.动态指定某一个SQL进行cache 3.故障切换,依赖于他的配置动态加载,但是不能自动选主,需要依赖keepalived和MHA 4.
3945 0
|
SQL 数据库 Go
如何把SQLServer数据库从高版本降级到低版本?
原文: 如何把SQLServer数据库从高版本降级到低版本? 由于目前还广泛使用着SQLServer2000,很多公司又想使用新的SQLServer,从而直接【分离/附加】或者【备份/还原】数据库,在不同版本之间存放。
4387 0
|
13天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
5285 28
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
8天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1044 1

热门文章

最新文章