1. C++ 头文件和std命名空间
-
旧的 C++ 头文件,如 iostream.h、fstream.h 等将会继续被支持,尽管它们不在官方标准中。这些头文件的内容不在命名空间 std 中。
-
新的 C++ 头文件,如 iostream、fstream 等包含的基本功能和对应的旧版头文件相似,但头文件的内容在命名空间 std 中。
注意:在标准化的过程中,库中有些部分的细节被修改了,所以旧的头文件和新的头文件不一定完全对应。 -
标准 C 头文件如 stdio.h、stdlib.h 等继续被支持。头文件的内容不在 std 中。
-
具有 C 库功能的新 C++ 头文件具有如 cstdio、cstdlib 这样的名字。它们提供的内容和相应的旧的C头文件相同,只是内容在 std 中。
可以发现,对于不带 .h 的头文件,所有的符号都位于命名空间 std 中,使用时需要声明命名空间 std;对于带 .h 的头文件,没有使用任何命名空间,所有符号都位于全局作用域。这也是 C++ 标准所规定的。
标准写法:
#include <cstdio>
int main(){
std::printf("http://c.biancheng.net\n");
return 0;
}
// Or
//在 main() 函数中声明命名空间 std,它的作用范围就位于 main() 函数内部
//如果在其他函数中又用到了std,就需要重新声明,比较方便的写法是在全局声明std。
//普通编程刷题这样使用比较方法快捷,但是在实际开发项目中增加了命名冲突的风险,建议在函数内部声明
#include <cstdio>
using namespace std;
int main(){
printf("http://c.biancheng.net\n");
return 0;
}
2. vector 的输入与输出
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。Vector 容器的几个特点:
- 顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
- 支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
- 容器使用一个内存分配器对象来动态地处理它的存储需求。
一维 Vector 的输入
// 未知数组个数,动态接受
int init_num = -10;
vector<int> input(100,init_num);
int num = 0;
int temp;
char c;
while((c = getchar()) != '\n'){
cin >> temp;
input[num++] = temp;
}
// 已知数组个数
int a[500]; int n;
m = 500;
for (int i = 0; i < n; ++i)
{
cin >> temp;
a[i] = temp;
}
一维 Vector 的输出
#include <iostream>
#include <vector>
int main() {
// initial a vector
std::vector<int> arrays{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 使用基本 for 循环
for(int i = 0; i < arrays.size(); ++i) {
std::cout << arrays[i] << " ";
}
std::cout << std::endl;
// 使用 for each 循环方法
for(auto array: arrays) {
std::cout << array << " ";
}
std::cout << std::endl;
// 使用 iterator 方法
for(auto it = arrays.begin(); it != arrays.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 使用 ostream_iterator
std::ostream_iterator<int> it(std::cout, " ");
std::copy(arrays.begin(), arrays.end(), it);
// std::for_each
std::for_each(arrays.begin(), arrays.end(), [](const auto &i){std::cout << i << " "; });
std::cout << "\n";
return 0;
}
基本用法:
#include <string.h>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int>obj;//创建一个向量存储容器 int
for(int i=0;i<10;i++) // push_back(elem)在数组最后添加数据
{
obj.push_back(i);
cout<<obj[i]<<",";
}
for(int i=0;i<5;i++)//去掉数组最后一个数据
{
obj.pop_back();
}
cout<<"\n"<<endl;
for(int i=0;i<obj.size();i++)//size()容器中实际数据个数
{
cout<<obj[i]<<",";
}
obj.clear();//清除容器中所以数据
// Vector 数组排序
//1.注意 sort 需要头文件 #include <algorithm>
//2.如果想 sort 来降序,可重写 sort
//bool compare(int a,int b)
//{
// return a< b; //升序排列,如果改为return a>b,则为降序
//}
//int a[20]={2,4,1,23,5,76,0,43,24,65},i;
//for(i=0;i<20;i++)
// cout<< a[i]<< endl;
//sort(a,a+20,compare);
vector<int>obj;
obj.push_back(1);
obj.push_back(3);
obj.push_back(0);
sort(obj.begin(),obj.end());//从小到大
cout<<"从小到大:"<<endl;
for(int i=0;i<obj.size();i++)
{
cout<<obj[i]<<",";
}
cout<<"\n"<<endl;
cout<<"从大到小:"<<endl;
reverse(obj.begin(),obj.end());//从大到小
for(int i=0;i<obj.size();i++)
{
cout<<obj[i]<<",";
}
//数组访问
//顺序访问
vector<int>obj;
for(int i=0;i<10;i++)
{
obj.push_back(i);
}
cout<<"直接利用数组:";
for(int i=0;i<10;i++)//方法一
{
cout<<obj[i]<<" ";
}
cout<<endl;
cout<<"利用迭代器:" ;
//方法二,使用迭代器将容器中数据输出
vector<int>::iterator it;//声明一个迭代器,来访问vector容器
for(it=obj.begin();it!=obj.end();it++)
{
cout<<*it<<" ";
}
return 0;
}
3. c++ 调用类成员和属性的几种方法
静态属性(方法)称为类的属性(方法) ,普通属性(方法)称为对象的属性(方法)
/*
调用类成员和属性的几种方法:
类名::属性或方法名
对象.属性或方法名
*/
#include<cstdio>
#include<iostream>
using namespace std;
class Cat{
public:
static int tot;
static void Comemet(){
tot=100;
}
static void Print(){
cout<<tot<<endl;
}
};
int Cat::tot=0;
int main()
{
Cat::Comemet();
Cat::Print();
cout<<Cat::tot<<endl;
Cat a;
a.Print();
a.Comemet();
cout<<a.tot<<endl;
return 0 ;
}
类和对象的方法和属性大的互相调用问题
- 公有私有保护同样适用类的属性和类的方法
- 类的属性必须在主函数外进行初始化
- 类方法和类属性不能和对象方法和对象属性重名。
- 对象方法可访问类方法和类属性,类方法不能直接访问对象方法和属性( 只有制定一个对象才可访问对象的方法和属性)
/* 一 公有私有保护同样适用类的属性和类的方法 */
#include<cstdio>
#include<iostream>
using namespace std;
class Cat{
private:
static int tot;
static void Comemet(){
tot=100;
}
};
int Cat::tot=0;/*编译*/
int main()
{
Cat::Comemet();/*编译失败 不能直接访问私有方法 */
cout<<Cat::tot<<endl;/*编译失败 不能访问直接直接私有成员 */
}
/* 二 类的属性必须在主函数外进行初始化 */
#include<cstdio>
#include<iostream>
using namespace std;
class Cat{
private:
static int tot;
public:
static void Comemet(){
tot=100;
}
};
int Cat::tot=0;
int main()
{
return 0;
}
/* 三 类所属内的所有函数和变量都不允许重名(函数重载的函数不重名)*/
#include<cstdio>
#include<iostream>
using namespace std;
class Cat{
private:
static int tot;
int tot;//编译失败 与Cat::tot冲突
public:
static void Comemet(){
tot=100;
}
static void Print(){
cout<<tot<<endl;
}
};
int Cat::tot=0;
int main()
{
return 0;
}
/*四 为了不产生二义性,所属的对象能访问直接类的内容*/