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;
}
相关文章
|
容器
push_back还是emplace_back?
emplace_back() 是 C++11 之后,vector容器中添加的新方法,和 push_back()一样,都是在容器末尾添加一个新的元素,相对于push_back函数,它减少了一次类的构造。不同的是emplace_back() 在效率上相比较于 push_back() 有了一定的提升。
|
6月前
|
编译器 C++ 容器
STL常用之vector,list,stack,queue,deque总结与对比
STL常用之vector,list,stack,queue,deque总结与对比
【C++】vector的使用 以及 迭代器失效问题
【C++】vector的使用 以及 迭代器失效问题
|
11月前
|
容器
emplace_back函数和to_string函数
emplace_back函数和to_string函数
|
存储 Linux 测试技术
vector迭代器失效与深浅拷贝问题
上文我们写了insert的模拟实现,最开始的版本是有许多Bug的,比如迭代器失效,最后经过优化修改实现了insert,这里我们以最初的版本为例,分析并解决迭代器失效问题。如下:
|
算法 C++ 容器
C++ vector 容器的全排列算法 next_permutation
C++ vector 容器的全排列算法 next_permutation
169 0
|
机器学习/深度学习 C++
C++ 中的 std::next_permutation 和 prev_permutation
它用于将范围 [first, last) 中的元素重新排列为下一个字典序更大的排列。一个排列是 N! 元素可以采用的可能排列(其中 N 是范围内的元素数)。不同的排列可以根据它们在字典上相互比较的方式进行排序。代码的复杂度为 O(n*n!),其中还包括打印所有排列。
106 0
|
安全 容器
别被vector最后一个元素erase错误
别被vector最后一个元素erase错误
177 0
别被vector最后一个元素erase错误
|
存储 C++ 容器
C++中push_back和emplace_back的区别
在 `C++11` 之后,`vector` 容器中添加了新的方法:`emplace_back()` ,和 `push_back()` 一样的是都是在容器末尾添加一个新的元素进去,不同的是 `emplace_back()` 在效率上相比较于 `push_back()` 有了一定的提升。
887 0
C++中push_back和emplace_back的区别