前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >1.C与C++

1.C与C++

作者头像
小飞侠xp
发布于 2018-12-14 06:38:10
发布于 2018-12-14 06:38:10
1.2K00
代码可运行
举报
运行总次数:0
代码可运行
C实现动态数组

存储学生信息,要求顺序存储可逐个添加信息,减少内存浪费。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
#include<string.h> //字符串处理
#include<malloc.h> //内存分配

struct Stu{ //单个学生结构体
    int id;  // 学号
    char name[20]; //姓名
};

struct Stu_arr{//学生组织结构体
    struct Stu *pstu; //指向结构体的指针
    int size; 
};

void init(struct Stu_arr *p_ss);
void destroy(struct Stu_arr *p_ss);
void push_back(struct Stu_arr *p_ss, struct Stu *p_stu);
void print(struct Stu_arr *p_ss);
int main(){
    struct Stu_arr ss;
    init(& ss); //初始化
    Struct  Stu stu1;
    stu1.id = 1;strcpy(stu1.name, "张三");
    push_back(&ss, &stu1);
    print(&ss);
    stu1.id = 5; strcpy(stu1.name, "mike");
    push_back(&ss, &stu1);
    print(&ss);
    destroy(&ss); //清理内存
    system("pause");
    return 0;
}
//初始化
void init(struct Stu_arr *p_ss) {
    p_ss->size = 0; 
    p_ss->pstu = NULL;
}

void destroy(struct Stu_arr *p_ss) {
    if (p_ss->pstu) // 
        free(p_ss->pstu);//释放内存
}
void push_back(struct Stu_arr *p_ss, struct Stu *p_stu) {
    struct Stu* p_new = (struct Stu*)malloc((p_ss->size + 1)
        * sizeof(struct Stu));
    memcpy(p_new, p_ss->pstu, p_ss->size * sizeof(struct Stu));
    memcpy(p_new + p_ss->size, p_stu, sizeof(struct Stu));
    free(p_ss->pstu);
    p_ss->pstu = p_new;
    p_ss->size++;
}
void print(struct Stu_arr *p_ss) {
    for (int i = 0; i < p_ss->size; i++) {
        printf("(%d,%s)\t", (p_ss->pstu)[i].id, (p_ss->pstu)[i].name);
    }
    printf("\n");
}

C++

使用c++中的标准库类型vector可以很轻松的完成任务。 不需要管理内存分配,对不同的类型都可以处理

使用c++中 string标准库类型string替代c中的字符数组类,编程更加自如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
#include<vector>
#include<string>
using namespace std;
struct Stu{
    int id;
    string name;
};

int main(){
    vector<Stu> ss;
    Stu stu1;
    stu1.id = 1; stu1.name = "张三";
    ss.push_back(stu1);
    stu1.id =5; stu1.name = "mike";
    ss.push_back(stu1);
    for(int i = 0; i < ss.size(); i++){
        cout<<"("<<ss[i].id<<",";
        cout<<ss[i].name<<")\t";
    }
    cout<< endl;  
    return 0}
C++对C的扩展(命名空间:作用域)

在相同作用域,同名变量只可以定义一次 不同作用域中,同名变量课重复定义 只有新定义的起作用

实际上,不同作用域的同名变量所占有的空间是不同的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
int x = 10;
void fun(){
    int x  = 20;
    printf(" fun()" x = %d\n,x);
}
int main(){
    int x = 30;
    {
        int x = 40;
        printf("main(){}: x =%d\n",x);
     }
     fun();
      printf("main():x = %d\n",x);
      return 0 ;
}

C++对C的扩展(命名空间:引入原因)

在大型项目过程中,经常会用到多家公司提供的类库,或者协作开发的多个小组之间,可能会使用同名的函数或者全局变量,从而造成冲突。

基本语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace 空间名字{
    变量;
    函数;
}(注意此处没有分号)

基本用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
空间名字::变量名/函数名

命名空间分割了全局命名空间(::) 每个命名空间都是一个作用域

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
namespace A {
    int x = 10;
    void print() { printf("A::x=%d\n", x); }
}
namespace B {
    int x = 20;
    void print() { printf("B::x=%d\n", x); }
}

int x = 30;
void print() { printf("x=%d\n", x); }
int main() {
    int x = 40;
    printf("main:x=%d\n", x); //局部变量x 40
    printf("全局:x=%d\n", ::x); //全局的x 30
    printf("命名空间A::x=%d\n", A::x);//A中的x 10
    printf("命名空间B::x=%d\n", B::x);//B中的x 20
    A::print(); //10
    B::print(); //20
    print();    //30
    return 0;
}

命名空间:使用方法

  1. 空间名字::变量名/函数名
  2. using 空间名字::变量名/函数名
  3. using namespace 空间名字

第一种方法推介,肯定不会有错 第2中种用法每次只能引入一个成员 第3种用法会打开该空间中所有的成员(变量/函数等),谨慎使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

namespace A {
    int x = 10, y = 20;
}
int x = 30;
int main() {
    //打开了A, A中的名字被“添加”到全局作用域
    {
        using namespace A;
        y++; //此处y是 A::y (ok)
        //x++; //此处的x可能是::x也可能是A::x (错误)
        ::x++; //指明了是全局作用域的x (ok)
        A::x++; //指明了是 A::x (ok)
        int x = 31; //当前的局部变量x (ok)
        x++;  //此处的x 是上面的局部变量 31 (ok)
    }

    {
        using A::x;
        x++; //此处的x是 A::x (ok)
    }

    return 0;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

namespace A {
    int x = 10, y = 20;
}
namespace B {
    int x = 30;
}
int main() {
    {
        using namespace A;
        using namespace B;
        y++; // ok
    }

    {
        using namespace A;
        using namespace B;
        //x++; //A B 中都有x, 二义性 (错误)
    }
    {
        using namespace A;
        int x; //定义局部变量 (ok)
    }

    {
        using A::x;
        //int x; //错误
    }

    return 0;
}

在实际使用中,要避免二义性错误,直接使用 空间名字::变量函数的写法是最保险的

命名空间:嵌套连续
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
namespace A{
    int a1 = 1;
    inr a2= 2;
    namespace A1{
        int x1 = 3;
        int y1 = 4;
    }
}
int main(){
    //方法1:  A::A1::作用域符
    cout <<A::A1::x1<<endl;
    //方法2
    using A::A1::x1;using A::A1::y1;
    cout<<y<<endl;
    //方法3
    using namespace A::A1;
    cout<<x1<<endl;
    //方法4
    using namespace A;
    cout<<A1::x1<<endl;
    return 0;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
namespace A{
    int a1=1;
    int a2 = 2;
}
namespace A{// 同名空间自动合并
    int b1 = 3;
    int b2 = 3;
}
int main(){
    return 0 ;
}
C++对C的扩展(输入输出:格式化)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main() {
    int a = 12345;
    double f = 123.4567;
    //默认输出整数
    printf("a=%d===\n", a);
    //占8格,右对齐
    printf("a=%8d===\n", a);
    //占8格,左对齐
    printf("a=%-8d===\n", a);
    //默认输出浮点数,小数显示6位
    printf("f=%f===\n", f);
    //占10格,小数显示2位,右对齐
    printf("f=%10.2f===\n", f);
    //占10格,小数显示2位,左对齐
    printf("f=%-10.2f===\n", f);

    return 0;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
    int a = 12345;
    double f = 123.4567;
    //默认输出整数
    cout << "a=" << a << "===" << endl;
    //占8格,右对齐
    cout << "a=" << setw(8) << a << "===" << endl;
    //占8格,左对齐
    cout << "a=" << setw(8) << setiosflags(ios::left)
        << a << "===" << endl;
    //默认输出浮点数,有效位数显示6位
    cout << "f=" << f << "===" << endl;
    //占10格,小数显示2位,右对齐
    cout << "f=" << setw(10) << setprecision(2)
        << setiosflags(ios::fixed) << setiosflags(ios::right)
        << f << "===" << endl;
    
    return 0;
}
字符串

C代码:输入输出字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# include<stdio.h>
int main(){
    char str[10] = {0};
    scanf("%s",str);
    printf("%s\n", str);
    return 0;
}

问题1:输入字符串有空格,无法处理 问题2:输入长度超过字符数组长度,不安全

以下代码解决问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <string.h>
int main() {
    char str[10] = { 0 };
    fgets(str, sizeof(str), stdin); // stdin 标准输入文件
    if (str[strlen(str) - 1] == '\n')
        str[strlen(str) - 1] = '\0';
    printf("%s\n", str);
    return 0;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
int main() {
    char str[10] = { 0 };
    cin.getline(str, sizeof(str));
    cout << str << endl;
    return 0;
}

C++代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
int main(){
    char str[10] = {0};
    cin>>str;
    cout<<str << endl;
    return 0;
}

问题1、2都存在 using namespace std; int main(){ char str[10] = {0}; cin.getline(str,sizeof(str)); cout <<str<<endl; return 0 ; }

C++基本内置类型

新增bool类型,取值是真(true),false(假)

基本类型转换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
int main(){
    // int 和 bool 转换(1,0)
    int i = 3;
    bool b = true;
    i = b ; // bool 转 int 
    cout << " i = " << i <<endl; // i =1
    cout<< " b = " << b<<endl; // b =1 ;
    i = 3 ;
    b = i ;
    cout << "b = "<<b<<endl; // b =1
    b = 0; // int 转bool 
    cout << "b = "<<b << endl;// b =0

    i = 3; b =1;
    cout<<(b == i)<<(i == b)<<endl;//
    i = 1; b =1 ;  
    cout<< (i == b)<< endl; //1
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
int main() {
    //int 和 char 转换
    int i = 67;
    char c = 'A'; // 'A'的ascii码是 65
    c = i;
    cout << "c= " << c << endl; //c= C
    c = 'A'; i = c;
    cout << "i= " << i << endl; //i= 65
    c = 'A'; i = 66;
    cout << c + i << endl;//131 (运算时,char先转int)
    cout << (i > c) << endl;//1

    return 0;
}
unsigned
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
    //unsigned 注意点:
    unsigned int a = 2, b = 1;
    cout << a - b << endl; // 1
    cout << b - a << endl; // 4294967295
    cout << hex << b - a << dec << endl; //0xFFFFFFFF
    long long long_a = 0xFFFFFFFF;
    cout << long_a << endl;// 4294967295

    //同内存同内容,解释不同而已。
    //相同的地址,相同的内容,只是解释方式的不同
    unsigned int ok = b - a;
    int *p_ok = (int*)&ok;
    cout << *p_ok << "---" << ok << endl;
    cout << &ok << endl;
    cout << p_ok << endl;

    //内存中放置 0x41424344 是啥值?
    char str[5] = { 'A','B','C','D','\0' };
    cout << str << endl;
    int *p_str = (int*)str;
    cout << *p_str << endl; //1145258561
    cout << hex << *p_str << dec << endl;
    cout << hex << (int)(str[0]) << str[1] << str[2] << str[3] << dec << endl;
    //hex输出,可以用 \x?

    //反过来也是一样的
    int test = 1145258561;
    char *p_char = (char*)&test;
    cout << *p_char << *(p_char + 1) << *(p_char + 2) << endl;

    return 0;
}

其中,1 - 2 运算转换成1 + (-2) 1的原码和补码都为0.......1; -2 的原码为1.....10,原码转换成补码:先转换成反码然后在加1:为111111...01 +1 = 11111...10

所以:1+(-2)= 0......1 + 111...10 = 111...111

变量的声明

变量可以多次声明,但只能定义一次

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int i1 ; //定义
int i2 =20;//定义
extern int i3 = 30 // 定义

extern int i4; //声明
列表初始化
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namspace std;
int main(){
    int i1 = 0;
    int i2 = {0};
    int i3(0);  // c++
    int i4{0}   // c++
    return 0;
}

列表初始化: 由一组花括号括起来的初始值进行初始化,使用该方式对内置类型变量初始化时,假如存在丢失信息的风险,编译器直接报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
int main(){
    double fd = 3.14
    int i1(fd), i2 = fd; //    ok
    int i3{fd},  i4 = {fd}; //error
    return 0}
指针和引用

//空指针 // NULL 在C中定义是((void*) 0 ) // NULL 在C++中定义是0 //nullptr 在 c++中用来表示空指针

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int *p = nullptr;
if(p)
    cout<< "p is false"<<endl;
else
    cout << "p is true"<<endl

指针实际上是地址,指针变量用来存放指针(指针)。 指针变量也是一种变量,同样要占用一定的存储空间,指针的存储空间存放的是一个地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
int main(){
    int i = 100;
    int  &ref_i  = i; // 引用
    cout<< i << "  " <<ref_i << endl ;
    // int &ref_i // 错误,引用必须被初始化
    // 注意书写方式:
    int *a1 = nullptr, a2 = 0;
    // 上面一行 :a1 是指针 ,a2是int变量
    int &r1 = a2, r2 = a2;
    // 上面一行:r1是a2的引用,r2是int变量
    return 0;
}

引用是给变量或对象起一个别名,定义时必须初始化,一旦绑定,终身不变,引用并不占有内存空间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
int main(){
    int a = 10;
    int &ra = a;
    cout<<&a<<&ra<<endl; //地址完全一样
    cout <<a << ra<<endl;//值完全一样
    int &ra2 = ra; //给ra再起一个别名
    int *pa = &a; // pa 是指针
    int *&rpa = pa ;// 给指针pa起别名叫rpa,ok
    return 0;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# include<iostream>
using namespace std;
void swap1(int *pa, int *pb){
    int tmp = *pa;
    *pa = *pb;
    *pb = tmp;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void swap2(int &a, int &n){
    int tmp = a;
    a = b ;
    b = tmp;
}
void swap3(int a1, int b1) {
    int tmp = a;
    a = b;
    b = tmp;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(){
    int a = 10,b = 20;
    swap1(&a,&b);
    cout<<a<<b<<endl; // 20 10
    swap2(a,b);
    cout<<a<<b<<endl;// 10 20
    swap3(a, b);
    cout << a << b << endl;//10 20 交换失败
}
    return 0 ;
    
}
数组的引用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
int main(){
    int a = 1,b =2 , c =3;
    // ok,指针数组
    int *ptr[] = {&a,&b,&c}
    // 错误 在数组中存放引用是不行的
    // int &r_arr[] = {&a ,&b , &c};
    int arr[3] = {a,b,c};
    int (*p1)[3] = &arr; //ok,数组指针,指向数组的指针
    int(&r1)[3] = arr; // ok,数组的引用
    return 0}

引用的本质,从下面的代码,可以猜测,引用好像就是一个指针,通过汇编代码的分析,可以推测引用实际上通过指针实现的,引用是指针的一种的包装:类似int * const p 这样的格式的一种包装。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
struct Stu{
    int age;
    char sexl;
    char name[20];    
};
struct A{int &data;};
struct B{char &data;};
struct C{stu &data;};
int main(){
    cout<<sizeof(A)<<endl; // 4
    cout<<sizeof(B)<<endl; // 4
    cout<<sizeof(C)<<endl; // 4
    return 0;
}
const 限定符

C代码 可以通过将const 常量的地址赋值给指针变量改变const常量的值,这通常是不被希望看见的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
int main() {
    const int i = 10;
    //const int i;  //错误,const变量必须在定义时初始化
    //i=100;        //错误,const类型不能修改
    int *p = &i;    //将i的地址赋值给指针p( 在C中ok)
    *p = 20;        //通过指针修改const int i的值
    printf("i=%d,*p=%d\n", i, *p); // 20 20
    return 0;
}

在C++中增强了对const的限制,不允许以上类似C的操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
int main() {
    const int i = 10;
    //int *pi = &i; 编译错误(C++中不行)
    const int *pi = &i; //ok
    //*pi = 20; 编译错误(指向常量的指针无法修改常量)

    //下面尝试,强转转换来修改常量:
    int *pi2 = (int*)&i; //将常量i的地址强转为int *
    *pi2 = 20;   //将pi2指针指向的地址内容修改为20
    //观察 *pi2 和 i 对应的内存地址是否一样:
    cout << "pi2=" << pi2 << " &i=" << &i << endl;
    //观察 *pi2 和 i 的值
    cout << "*pi2=" << *pi2 << " i=" << i << endl;
    //输出 *pi2=20 i=10
    //思考:为什么会出现这样的结果??

    //一定要这么做,怎么做?
    volatile const int ii = 10; //使用volatile关键字
    int *pii = (int*)&ii;
    *pii = 20;
    cout << "*pii=" << *pii << " ii=" << ii << endl;
    //输出 *pii=20 ii=20

    return 0;
}

默认情况下,const对象仅在文件内有效,假如要在多个文件中生效,则const变量不管是声明还是定义,都加上extern关键字。

const与引用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
int main() {
    const int i = 10;
    //int &ri = i; 错误,非常量引用指向常量
    int ii = 20;
    const int &rii = ii; //OK
    //rii = 30; 错误,常量引用无法修改值

    double fd = 1.23;
    //int &r = fd; 错误
    const int &r = fd; //OK
     //观察 fd 和 r 的值
    cout << fd << " " << r << endl;
    //观察 fd 和 r 的地址
    cout << &fd << endl;
    cout << &r << endl;

    return 0;
}

以上代码中 r 绑定了一个临时量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int temp = fd;
const int &r = temp;
指针与const
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
int main() {
    int i = 10, j = 30;
    int *p1 = &i; //无const限定
    *p1 = 20; //可以改变指向变量的值(i-->20)
    p1 = &j;  //可以改变指向的变量(p1指向了j)

    //指向常量的指针
    const int *p2; //const在*前面(也可写int const *p2)
    p2 = &i;    //p2 的指向 可以改变 (意味着p2不是常量)
    p2 = &j;
    //*p2 = 100; 错误,*p2改不了值(意味着*p2是常量)

    //常量指针(指针本身是常量)
    int * const p3 = &i; //const在*后面
    //p3 = &j; 错误,p3的指向不能改变(p3是常量)
    *p3 = 100; //OK, *p3可以修改

    //指向常量的常量指针
    const int * const p4 = &i; //两个const
    //p4 = &j; 错误
    //*p4 = 100; 错误
    return 0;
}

指向常量的指针 const int *p2 //const在* 前面,也可以写成 int const *p2 其中,p2的指向可以改变,意味着p2不是常量,但是 *p2不能改变,意味着*p2是常量 所以 上面 const 限定的是 *p2

常量指针

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int * const p3 = &i; // const在*之后
// p3 = &j ; // 错误 p3的指向不能改变(p3是常量)
* p3 = 100; // OK,*p3 可以修改

指向常量的常量指针

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int * const p4 = &i ;//两个const
// p4 = &j; 错误
// * p4 = 100; 错误
return 0 ;

顶层const :指针本身是常量(常量指针int *const p1) 底层const :指正指向的对象是常量(指向常量的指针 const int *p2)

数据类型 struct 和 class
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
class player {
public:
    player(int level = 0, int hp = 0)
        :level(level), hp(hp) {}
    void train(int nums) {
        int killnums = hp > nums ? nums : hp;
        level += killnums;  hp -= killnums;
        cout << "练级:长了 " << killnums << " 级。";
        cout << "当前:level=" << level << ",hp=" << hp << endl;
    }
    void pk(player &another) {
        int power1 = level * 100 + hp;
        int power2 = another.level * 100 + another.hp;
        if (power1 >= power2)
            printf("You win!\n");
        else
            printf("You loss!\n");
    }
private:
    int level;  //等级
    int hp;     //hp值
};

int main() {
    player p1(1, 100); player p2(2, 50);
    p1.train(6);
    p2.train(10);
    p1.pk(p2);
    system("pause");
    return 0;
}
字符串

C语言

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <string.h>
int main() {
    //字符数组
    char str1[20] = "abcde";        //初始化
    char str2[20] = { 'a','b','c' };//初始化
    //str2 = "abc"; 错误
    char str3[20];
    str3[0] = 'a'; str3[1] = 'b'; str3[2] = '\0';
    //字符指针
    char *pstr = "bcd"; //将常量字符串的地址赋给pstr
    pstr = "def";
    pstr = str1;
    pstr[0] = 'x';      //通过指针修改
    *(pstr + 1) = 'y';  //通过指针修改
    printf("str1=%s\n", str1); // 输出xycde
    //字符串长度
    printf("str1长度= %d\n", strlen(str1));  //5
    //字符串拷贝
    printf("str1=%s\n", strcpy(str1, "ddd"));//ddd
    //字符串连接
    printf("str1=%s\n", strcat(str1, str2)); //dddabc
    //字符串比较
    if (strcmp(str2, str3) > 0)
        printf("%s > %s\n", str2, str3);
    else if(strcmp(str2, str3) == 0)
        printf("%s == %s\n", str2, str3);
    else
        printf("%s < %s\n", str2, str3);
    //字符串查找
    strcpy(str2, "--ab=="); //str3: "ab"
    printf("%s\n", strstr(str2, str3)); //ab==
    return 0;
}

C++

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <string>
using namespace std;
int main() {
    //std::string
    std::string str1("abc"); //初始化
    string str2 = "bcd";     //初始化
    str2 = "defg";           //可以直接赋值
    str2 = str1;             //可以直接赋值
    
    const char *pstr = str2.c_str(); //转c风格字符串
    str2[0] = 'X';      //可以直接下标访问操作
    str2.at(1) = 'Y';   //可以 at 访问操作
    cout <<"str2=" << str2 << endl; //XYc
    
    //求字符串长度
    cout << str2.size() << endl;
    cout << str2.length() << endl;
    //strlen(str1); 错误
    cout << strlen(str2.c_str()) << endl; //正确
    //字符串连接
    str2 = str2 + str1 + "!!";
    cout << "str2=" << str2 << endl; //XYcabc!!
    //字符串比较 (str1: abc)
    cout << str2.compare(str1) << endl; //-1
    cout << (str2 < str1) << endl;      //1
    //字符串查找
    cout << str2.find(str1) << endl;    //3
    //字符串提取
    string str3 = str2.substr(3, 3);
    cout << str3 << endl;               //abc

    return 0;
}
vector
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
    //std::vector的结构
    std::vector<int> vec11; // [ 1, 3, 9 ...]
    vector<string> vec22;   // [ "abc", "play", "C++" ]
    vector<vector<int>> vec33; // [ [1,3,9..],[2,3,4..], ... ]
    vector<vector<string>> vec44; // [ ["hello","C",..],["C++","abc",..],... ]

    //vector的初始化
    vector<int> vec1 = { 1,2,3 };
    vector<int> vec2{ 1,2,3 };  //列表初始化
    vector<int> vec3 = vec1;    //vec1拷贝给 vec3
    vector<int> vec4(10);       //初始化10个元素,每个元素都是0
    vector<int> vec5(10, -1);   //初始化10个元素,每个元素都是-1
    vector<string> vec6(10, "hi"); //初始化10个元素,每个元素都是 "hi"

    //判断是否为空
    cout << vec1.empty() << endl; //0
    //元素个数
    cout << vec1.size() << endl;  //3
    //添加元素在最后面
    vec1.push_back(100);
    cout << vec1[vec1.size() - 1] << endl; //100
    //弹出元素在最后面
    vec1.pop_back();
    cout << vec1[vec1.size() - 1] << endl; //3
    //直接下标访问元素
    cout << vec1[1] << endl; //2
    vec1[1] = 10;
    cout << vec1[1] << endl; //10
    // vector<string> vec6(10, "hi")
    vec6[0][1] = 'X';
    cout << vec6[0] << endl; //hX

    //遍历(类似遍历数组)
    for (int i = 0; i < vec1.size(); i++) 
        cout << vec1[i] << " "; // 1 10 3
    cout << endl;

    return 0;
}

标准库类型vector表示对象的集合,其中所有的对象类型必须相同,因为vector 容纳着其他对象,所以被称为容器,vector是一个类模板。

auto 类型说明符
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

int main() {
    //1.auto 变量必须在定义时初始化,类似于const
    auto i1 = 0; auto i2 = i1;
    //auto i3; //错误,必须初始化
    //2.如果初始化表达式是引用,则去除引用语义
    int a1 = 10;
    int &a2 = a1; // a2是引用
    auto a3 = a2; // a3是int类型,而不是引用
    auto &a4 = a1; // a4是 引用
    //3.去除顶层const
    const int b1 = 100;
    auto b2 = b1; // b2 是 int
    const auto b3 = b1; // b3是 const int
    //4.带上底层const
    auto &b4 = b1; // b4 是 const int 的引用
    //5.初始化表达式为数组时,推导类型为指针
    int arr[3] = { 1,2,3 };
    auto parr = arr; //parr 是 int * 类型
    cout << typeid(parr).name() << endl;
    //6.表达式为数组且auto带上&,推导类型为数组
    auto &rarr = arr; //rarr 是 int [3]
    cout << typeid(rarr).name() << endl;
    //7.函数参数类型不能是 auto
    //func(auto arg); //错误
    //8.auto并不是一个真正的类型,编译时确定
    //sizeof(auto); 错误
    return 0;
} 

迭代器:返回指针

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    vector<string> vs =
        { "all","people","like","c++" };

    for (vector<string>::iterator i = 
                 vs.begin(); i != vs.end(); i++)
        cout << *i << " ";
    cout << endl;

    for (auto i = vs.begin(); i != vs.end(); i++) 
        cout << *i << " ";
    cout << endl;

    for (auto &s : vs)
        cout << s << " ";
    cout << endl;

    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.11.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
华米OV们2020渡劫
在近日举办的2020年华为开发者大会(HDC)上,华为正式发布了最新的鸿蒙OS 2.0(Harmony OS 2.0)、EMUI 11移动操作系统和HMS Core 5.0移动生态基座。
刘旷
2020/09/14
5070
华米OV们2020渡劫
手机厂商求变
在过去十几年,中国庞大的蓝海市场成为了智能手机增长的核心驱动力,由此从中诞生出一批叫人耳熟能详的手机品牌:小米、华为、荣耀、OPPO 、vivo……它们各有特色,各有拥趸,再加上国外的苹果和三星,它们在互联网中形成了一股让人难以忽视的舆论力量。
用户6132544
2022/07/06
5430
余承东说华为OS操作系统最快今秋面市,真的能承受之重吗??
前几天,美国商务部的工业和安全局(BIS)把华为公司加入其Entity List(实体清单)。华为面临着美国供应商“断供”的巨大压力。
刘盼
2019/05/22
8080
余承东说华为OS操作系统最快今秋面市,真的能承受之重吗??
Google Android向华为“闭源”,华为手机迎来至暗时刻!
居安思危任正非,未雨绸缪如华为。在贸易战的背景下,即使早在多年前已在多个层面做好“备胎”计划的华为,在面对美国对芯片乃至操作系统等系列釜底抽薪的打压时,还是受到了一定的打击与影响。
AI科技大本营
2019/05/22
1.7K0
为什么国内手机巨头们都不支持鸿蒙?
鸿蒙OS2.0出世,国内一众智能手机厂商终于有了国产的系统使用,不再仰仗洋人的鼻息,眼巴巴地排队等着安卓系统的更新和推送,终于可以翻身农奴把歌唱了!这是国产科技发展的机遇,也是科技自立自强的趋势。
悲了伤的白犀牛
2021/07/09
1.2K0
荣耀独立一周年,能接替华为之后的高端市场吗?
12月16日,荣耀举行八周年庆,CEO赵明是这样定位荣耀的,“对于荣耀而言,我们更看重的就是要坚持好自己对于方向的判断,不跟随别人的指挥棒,或者是不被别人牵着鼻子走,而是基于现有的供应和技术发展的方向和节奏,做出最好的选择”。
用户2908108
2022/02/10
3280
荣耀独立一周年,能接替华为之后的高端市场吗?
华为在高端智能手机市场再次撕开了一道深深的口子
8月29日,华为宣布推出“HUAWEI Mate 60 Pro先锋计划”,并于当天中午在官方商城、部分线下门店上线销售新机Mate 60 Pro,它是全球首款支持卫星通话的大众智能手机,即使在没有地面网络信号的情况下也可以与外界联系,令人欣喜。
刘旷
2023/09/11
2420
谷歌暂停与华为相关业务合作,遭遇突变华为该何去何从?
5月20日,谷歌正式宣布将暂停与华为的相关业务合作,其中包括需要转移硬件、软件和技术服务的相关业务,开源业务则不受影响。这意味着,华为将不再能获得谷歌旗下安卓系统的及时更新,只能使用公开的安卓开源版本。使用安卓系统的华为手机将不再能使用谷歌旗下的应用与服务,包括谷歌应用商店、Gmail和Youtube等。
VRPinea
2019/05/22
1.1K0
谷歌暂停与华为相关业务合作,遭遇突变华为该何去何从?
自研芯片的豪赌:华为小米vivo仍在坚持,OPPO盖牌离场,荣耀开始下注!
5月31日消息,虽然OPPO在不久前因为“全球经济、手机市场不确定性”解散了旗下的芯片设计子公司哲库科技,放弃了自研芯片,但是另外两家国产智能手机厂商小米、vivo的自研芯片计划仍在继续,现在荣耀也开始成立芯片设计公司加码自研芯片了。
芯智讯
2023/08/09
3090
自研芯片的豪赌:华为小米vivo仍在坚持,OPPO盖牌离场,荣耀开始下注!
大模型这把大火,烧到了手机领域
AI大模型从年初一直火到了年尾,但似乎离普通人还有些距离。不过,现在情况似乎有了一些变化,各大手机厂商们,正在争先恐后地把大模型装进手机里,让AI变得“触手可及”。
刘旷
2023/12/15
2300
俄罗斯被禁用安卓系统,或将转向鸿蒙?
2019年,在万物互联时代即将开启,5G元年正式到来之际,面对美国的制裁打压和谷歌的一纸安卓禁令,华为不得不正式推出自己的备用操作系统鸿蒙OS。 鸿蒙OS的诞生是华为应对万物互联的时代要求及外界制裁打压的必然之举。鸿蒙OS自2012年开始规划,到2019年正式发布,7年时间蕴育的国人自己的操作系统,一经发布便备受关注。 然而,操作系统是典型的寡头垄断市场,历史经验告诉我们,在安卓和苹果两大生态系统的夹击下,鸿蒙OS想要生存下去并非易事。 毕竟,开发操作系统只是万里长征的第一步,拥有好的生态才能走得更远。
老九君
2022/03/30
1K0
麒麟回归之后,OPPO重启“造芯”?
近日,有传闻称OPPO可能将重启“芯片设计”业务,并已开始招揽前哲库科技员工回归。对此,OPPO官方表示“不予置评”。
芯智讯
2023/09/20
3340
麒麟回归之后,OPPO重启“造芯”?
国产手机:2022疑无路,2023又一村?
1月28日,Counterpoint Research公布的2022中国智能手机市场销量报告显示,中国智能手机销量2022年同比下降14%,达到十年来的最低水平。销量持续走下坡路,国内智能手机厂商们似乎已难改市场羸弱现状。
刘旷
2023/02/08
2150
谷歌5nm芯片围魏救赵:打响与华为的反击战
外媒Axios称,谷歌正式宣布和三星打造自研芯片。谷歌自研的SoC已经流片,将有望在Pixel系列手机上搭载。这颗芯片代号叫做“Whitechapel”,搭载的是8核CPU,采用三星5nm工艺制程,在一系列测试后,处理器将正式对外官宣。
刘旷
2020/04/24
3940
谷歌5nm芯片围魏救赵:打响与华为的反击战
大模型手机密集下场:华为、荣耀、OPPO、vivo、小米杀疯了
不出意外,AI大模型浪潮卷到了智能手机领域,智能手机厂商争先恐后地自研AI大模型或者联手AI大模型厂商,挖掘智能手机与AI大模型的融合发展的巨大潜力。
刘旷
2023/11/06
4200
失速OPPO破局:自主造芯、入局IoT
在今年的6.18大战中,OPPO可以说是出尽了风头。OPPO旗下的OPPO Watch虽然是智能穿戴中的新人,但是却在6月1日当天拿下了京东、天猫全价位段安卓eSIM手表品类双料冠军。
刘旷
2020/06/05
5620
失速OPPO破局:自主造芯、入局IoT
中国操作系统往事
导读:20年沉浮过后,操作系统走到新的十字路口,中国国产操作系统会迎来突围机会吗?
IT阅读排行榜
2019/05/24
1.6K0
中国操作系统往事
新火种AI|手机大模型开卷,但划时代的改变还没到来
1月18日,随着三星新一代旗舰S24系列的正式发布,喊出“开启移动AI新时代”的口号,在新机中引入视频AI处理、AI聊天机器人、影像画面处理、通话实时翻译等多项AI功能,AI手机正式成为国内外手机厂商共同的“进化趋势”。
新火种
2024/02/13
1260
新火种AI|手机大模型开卷,但划时代的改变还没到来
自研操作系统,欧瑞博的又一次疯狂押注
当一家智能家居公司决定研发原生操作系统时,科技行业又“卷”出了新高度。 5月18日晚,智能家居“小巨人”欧瑞博在2022年度战略新品发布会上,发布了双屏智能语音开关MixSwitch Defy戴妃、极简智能语音开关巴赫系列、全球首款家居装饰型智慧屏MixPad 7 Ultra和次世代拟自然光智能苍穹照明系列等“摸得着”的硬件新品。 但最受行业关注的却是摸不着的一款新品:全新智能物联网操作系统HomeAI OS 4.0。相较于此前几代的HomeAI来说,HomeAI OS 4.0最大变化在于多了“OS”二
罗超频道
2022/05/20
1.1K0
自研操作系统,欧瑞博的又一次疯狂押注
智能手机的重点是自研芯片,还是做好营销布局呢?
近日,深圳市智信新信息技术有限公司已经与华为投资控股有限公司签署了关于荣耀的收购协议,完成对于荣耀业务的全面收购。华为称,此后不再持有新荣耀公司的任何股份,也不会参与经营和管理决策。
灵猫财经
2020/11/24
5490
推荐阅读
相关推荐
华米OV们2020渡劫
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档