C++ 基础 --- C++ 头文件和std命名空间、一维 vector 的输入与输出、调用类成员和属性的几种方法

1. C++ 头文件和std命名空间

  1. 旧的 C++ 头文件,如 iostream.h、fstream.h 等将会继续被支持,尽管它们不在官方标准中。这些头文件的内容不在命名空间 std 中。

  2. 新的 C++ 头文件,如 iostream、fstream 等包含的基本功能和对应的旧版头文件相似,但头文件的内容在命名空间 std 中。
    注意:在标准化的过程中,库中有些部分的细节被修改了,所以旧的头文件和新的头文件不一定完全对应。

  3. 标准 C 头文件如 stdio.h、stdlib.h 等继续被支持。头文件的内容不在 std 中。

  4. 具有 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 容器的几个特点:

  1. 顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
  2. 支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
  3. 容器使用一个内存分配器对象来动态地处理它的存储需求。

一维 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 ;
}

类和对象的方法和属性大的互相调用问题

  1. 公有私有保护同样适用类的属性和类的方法
  2. 类的属性必须在主函数外进行初始化
  3. 类方法和类属性不能和对象方法和对象属性重名。
  4. 对象方法可访问类方法和类属性,类方法不能直接访问对象方法和属性( 只有制定一个对象才可访问对象的方法和属性)
/*  一 公有私有保护同样适用类的属性和类的方法 */
#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;
}

/*四  为了不产生二义性,所属的对象能访问直接类的内容*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值