重学C++ 重构C++知识体系

C++基础容器

序列型容器--数组

◆ 概念

  • 代表内存里一组连续的同类型存储区
  • 可以用来把多个存储区合并成一个整体

    比如:

      int arr[10] = {1,2,3,4,5,6,7,8};

◆ 数组声明

  • int arr[10]
  • 类型名称int表示数组里所有的元素的类型
  • 名称arr是数组的名称
  • 整数10表示数组里包含的元素个数
  • 数组元素个数不可变

新型数组--vector

◆ Vector 是面向对象方式的动态数组

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

vector 可以完成动态扩容的过程

#include<vector>
using namespace std;
int main()
{

	vector<int> vec = { 1,2,3,4 };
	vec.push_back(5); # 在尾部进行元素插入操作
    return 0;
}

capacity 当前vector分配的大小

size 当前使用数据的大小

// vector_test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
	//顺序访问
	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容器,作用:遍历或者指向vector容器的元素 
	for (it = obj.begin(); it != obj.end(); it++)
	{
		cout << *it << " ";
	}
	return 0;
}

字符串变量与常量 

◆ 字符串变量

  • 字符串是以空字符('\0')结束字符数组
  • 空字符 '\0' 自动添加到字符串的内部表示中国
  • 在声明字符串变量时, 应该为这个空结束符预留一个额外元素的空间如:char strHelloWorld ={“Helloworld”};

◆ 字符串的指针表示方法

◆ 字符串的常见操作

  • 字符串长度 strlen(s)
  • 字符串比较: strcmp(str1,str2)
  • 字符串拷贝:strcpy(s1,s2)   复制字符串s2到s1
  • 复制指定长度字符串: strncpy(s1,s2,n)
  • 字符串拼接: strcat(str1,str2) 将字符串str2接到str1后边
  • 查找字符串: strchr(s1,ch)查找ch第一次出现的位置
  • 查找字符串:strstr(s1,s2)在s1里查找s2第一次出现的位置

#include "stdafx.h"
#include<string.h>
#include<iostream>
using namespace std;


int main()
{
    // 定义一个数组
	char strHelloWorld[11] = { "helloworld" }; 
	cout << strlen(strHelloWorld) << endl;
    return 0;
}

C++指针

c++中内存单元内容和地址

◆ 内存有很多内存单元构成。这些内存单元存放着各种类型的数据。

◆ 计算机对内存的每个内存单元都进行了编号,这个编号就称为内存地址,地址决定了内存单元在内存中的位置。

◆ 记住这些内容单元并不方便,于是c++语言的编译器让我们通过名字来访问这些内存地址。

指针的定义和间接访问操作

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

type *var-name;

type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

C++ 中使用指针

使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作:

#include "stdafx.h"
#include <iostream>

using nam
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++中,snprintf是一个用于格式化字符串的函数,它可以将格式化后的字符串输出到指定的缓冲区中。重构snprintf的目的是改进其性能或者可读性,或者添加一些额外的功能。 在重构snprintf时,可以考虑以下几个方面: 1. 性能优化:可以通过减少内存分配和复制操作来提高性能。例如,可以使用预先分配的缓冲区来避免频繁的内存分配和释放。 2. 错误处理:可以增加错误处理机制,例如检查输入参数的有效性,并返回错误码或抛出异常。 3. 扩展功能:可以添加一些额外的功能,例如支持更多的格式化选项或自定义输出格式。 4. 可读性改进:可以通过重命名变量、提取公共代码块为函数等方式来提高代码的可读性和可维护性。 以下是一个简单的示例,展示了如何重构snprintf函数: ```cpp #include <cstdio> #include <cstdarg> #include <string> // 重构后的snprintf函数 int my_snprintf(char* buffer, size_t size, const char* format, ...) { va_list args; va_start(args, format); int result = vsnprintf(buffer, size, format, args); va_end(args); if (result < 0 || result >= static_cast<int>(size)) { // 错误处理 throw std::runtime_error("snprintf failed"); } return result; } int main() { char buffer[100]; std::string name = "Alice"; int age = 25; // 使用重构后的snprintf函数 my_snprintf(buffer, sizeof(buffer), "My name is %s and I am %d years old.", name.c_str(), age); printf("%s\n", buffer); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值