默认构造函数准确来说就是在调用时不需要传入形参的构造函数。 C++11 在原有提供默认构造函数、赋值构造函数、复制赋值运算符和析构函数的基础上增加移动构造函数和移动复制运算符。
默认构造函数原型:SomeClass::SomeClass(const SomeClass&)
移动构造函数原型:SomeClass::SomeClass(SomeClass&&)
默认复制运算符:SomeClass& SomeClass::operator(const&SomeClass&)
默认移动复制运算符:SomeClass& SomeClass::operator(SomeClass&&)
另外,默认移动构造函数和移动辅助运算符的工作版本相似,逐行执行成员初始化并复制内置类型,如果是类成员则调用相应的构造函数和赋值运算符,如果定义了移动构造函数和移动赋值运算符,否则调用赋值构造函数和赋值运算符。
class SomeClass{
public:
SomeClass(SomeClass&&);
SomeClass()=default;
SomeClass(const Someclass&)=default;
SomeClass & operator=(const SomeClass &)=default;
SomeClass & operator=(SomeClass&&) =default;
}
//default 只能用于6个特殊的成员函数,而delete可以用于任何成员函数,一种可能的用法是禁用某些转换
class SomeClass{
...
public:
void redo(double);
void redo(int)=delete;
...
}
//这种情况下调用 redo(5)表示与redo(int)匹配,编译器将报错
memmove:
memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
原型:void *memmove( void* dest, const void* src, size_t count );
头文件:<string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
相关函数:memset、memcpy
std::vector::reserve
// vector::reserve
#include <iostream>
#include <vector>
int main ()
{
std::vector<int>::size_type sz;
std::vector<int> foo;
sz = foo.capacity();
std::cout << "making foo grow:\n";
for (int i=0; i<100; ++i) {
foo.push_back(i);
if (sz!=foo.capacity()) {
sz = foo.capacity();
std::cout << "capacity changed: " << sz << '\n';
}
}
std::vector<int> bar;
sz = bar.capacity();
bar.reserve(100); // this is the only difference with foo above
std::cout << "making bar grow:\n";
for (int i=0; i<100; ++i) {
bar.push_back(i);
if (sz!=bar.capacity()) {
sz = bar.capacity();
std::cout << "capacity changed: " << sz << '\n';
}
}
return 0;
}
making foo grow:
capacity changed: 1
capacity changed: 2
capacity changed: 4
capacity changed: 8
capacity changed: 16
capacity changed: 32
capacity changed: 64
capacity changed: 128
making bar grow:
capacity changed: 100
C++ STL 之set
首先STL 默认的set和map都是有序排列的,默认是升序排列;
set是基于红黑树,查找复杂度是Log(n),有迭代器版本使用迭代器版本;
lower_bonde: 返回最小的对等于查找对象的迭代器
upper_bonde:返回最小的大于查找对象的迭代器
map set insert().second 如果插入成功返回true,否则返回false;
greater<int>(left,right)return left>right;
less<int>(left,right)return left<right;