Vector初始化问题
- 默认初始化,vector为空,size为0,未开辟空间,可通过push_back()添加元素。
vector<int> v;
v.push_back(10);
- 默认初始化,指定vector大小,元素初始值默认为0,元素增多时,同样可以通过push_back()来改变vector大小以增加元素。
vector<int> v(5)
- 指定初始化元素值为2
vector<int> v(5,2);
- 指定初始化元素值
vector<int> v = {1,2,3,4,5}
- 用已存在的vector初始化新的vector
vector<int> v(5,2);
vector<int> v_copy(v);
- vector<vector>的初始化
vector<vector>:说到底也还是一个vector,所以跟vector的初始化一样,第一个值表示大小,第二个表示元素值,只不过不同的是vector<vector>的元素值也是一个vector(同理也可以使用push_back(v)添加元素)
vector<int> v(5,1);
vector<vector<int>> matrix(5,v);
using的用法
命名空间
在书写模块功能时,为了防止命名冲突会对模块取命名空间,这样子在使用时就需要指定是哪个命名空间,使用using声明,则后面使用就无须前缀了。需要注意的是每个名字需要独立的using声明。
using std::cin; //using声明,当我们使用cin时,从命名空间std中获取它
int main()
{
int i;
cin >> i; //正确:cin和std::cin含义相同
cout << i; //错误:没有对应的using声明,必须使用完整的名字
return 0;
}
using std::cout;
using std::endl;
//或者直接:
using namespace std;
位于头文件的代码一般来说不应该使用using声明。因为头文件的内容会拷贝到所有引用它的文件中去,如果头文件里有某个using声明,那么每个使用了该头文件的文件就都会有这个声明,有可能产生名字冲突。
在子类中引用父类成员
在子类中对基类成员进行声明,可恢复基类的防控级别。有三点规则:
- 在基类中的private成员,不能在派生类中任何地方用using声明。
- 在基类中的protected成员,可以在派生类中任何地方用using声明。当在public下声明时,在类定义体外部,可以用派生类对象访问该成员,但不能用基类对象访问该成员;当在protected下声明时,该成员可以被继续派生下去;当在private下声明时,对派生类定义体外部来说,该成员是派生类的私有成员。
- 在基类中的public成员,可以在派生类中任何地方用using声明。具体声明后的效果同基类中的protected成员。
class Base
{
protected:
void test1() { cout << "test1" << endl; }
void test1(int a) {cout << "test2" << endl; }
int value = 55;
};
class Derived : Base //使用默认继承
{
public:
//using Base::test1; //using只是声明,不参与形参的指定
//using Base::value;
void test2() { cout << "value is " << value << endl; }
};
上面的class的默认继承是private,这样子类中是无法访问基类成员的,即test2会编译出错。但是如果我们把上面注释的声明给放开,则没有问题。注意:using::test1只是声明,不需要形参指定,所以test1的两个重载版本在子类中都可使用。
起别名
相当于传统的使用typedef为现有类型创建别名,定义易于记忆的类型名。
typedef std::vector<int> intvec;
using intvec = std::vector<int>; //这两个写法是等价的
typedef void (*FP) (int, const std::string&);
using FP = void (*) (int, const std::string&);
若不是特别熟悉函数指针与typedef,第一眼还是很难指出FP其实是一个别名,代表着的是一个函数指针,而指向的这个函数返回类型是void,接受参数是int, const std::string&。而using的写法把别名的名字强制分离到了左边,而把别名指向的放在了右边,比较清晰,可读性比较好。
long long类型
相比于C++98标准,C++11整型的最大改变就是多了 long long。分为两种:long long 和unsigned long long。在C++11中,标准要求long long 整型可以在不同平台上有不同的长度,但至少有64位。我们在写常数字面量时,可以使用LL后缀(或是ll)标识一个long long 类型的字面量,而ULL (或ull、Ull、uLL) 表示一个unsigned long long 类型的字面量。(C++中,int占用4字节,32比特,数据范围为-21474836482147483647[-2^312^31-1]。int型数据是一个有符号的整型数据,其最高位为符号位(0表示正,1表示负))比如:
long long int lli=-900000000000000LL; // 有符号的long long 变量lli
unsigned long long int ulli=-900000000000ULL; // 无符号的 unsigned long long 变量ulli。
using LL = long long;
LL ll = -900000000000000LL;
对于有符号的,下面的类型是等价的:long long、signed long long、long long int、signed long long int; 而unsigned long long 和 unsigned long long int 也是等价的。
与 long long 整型相关的一共有3个:LONG_MIN、LONG_MAX 和ULONG_MAX, 它们分别代表了平台上最小的long long 值、最大的long long 值,以及最大的unsigned long long 值。