数组
- 相同类型的数据的集合{ },通过索引访问元素;
- 在内存中连续存储,属于顺序表;
- 插入、删除时间复杂度 O ( n ) O(n) O(n),访问复杂度 O ( 1 ) O(1) O(1)
- 定义数组,首先确定内部的数据类型,并指定长度(常量),初始化时只能使用{ }来初始化;
// 定义
int arr[30] = {
1, 2, 3}; // 后面的值默认为0,初始值个数不能超过长度
// 不指定长度时,需要初始化
double score[] = {
79.5, 80.5, 90};
// 访问数组,注意索引越界问题
for(int i=0; i < sizeof(arr) / sizeof(arr[0]) ; i++){
cout << "arr[" << i << "]:" << arr[i] << endl;
}
// 仅仅获取元素
for(int e:arr){
cout << e << endl;
}
- 数组内部嵌套数组,即二维数组
// 定义二维数组
int arr[2][3] = {
{
1,2,3},
{
4,5,5}
};
// 遍历
int rowCount = sizeof(arr) / sizeof(arr[0]);
int colCount = sizeof(arr[0]) / sizeof(arr[0][0]);
for(int i=0; i<rowCount; i++){
for(int j=0; j<colCount; j++){
cout << arr[i][j] << endl;
}
}
// 元素遍历
for(auto& row:arr){
// 复合数据类型需要 &引用
for(auto e:row){
// auto 自动类型
cout <<e << endl;
}
}
- 数组实现 选择排序
int main() {
int arr[] = {
4, 3, 2, 1, 5};
// 选择排序O(n^2)
// 每次选择最大值或者最小值,放在最后一位
// n个数 做n-1次选择
int arrLen = sizeof(arr) / sizeof(arr[0]);
int n = arrLen - 1;
int temp;
while (n >= 1) {
// 控制选择次数
int max_idx = 0; //
for (int i = 1; i <= n; i++) {
if (arr[i] > arr[max_idx]) {
max_idx = i;
}
}
// 交换
if (max_idx != n) {
// 交换
temp = arr[n];
arr[n] = arr[max_idx];
arr[max_idx] = temp;
}
n--;
}
for (int i = 0; i < arrLen; i++) {
cout << arr[i] << endl;
}
- 数组实现 冒泡排序
int main() {
int arr[] = {
4, 3, 2, 1, 5};
// 冒泡排序 O(n^2)
// 每次将较大值向后一位冒泡
// n个数 做n-1轮冒泡
int arrLen = sizeof(arr) / sizeof(arr[0]);
int temp;
for (int i = 0; i < arrLen - 1; i++) {
// 控制冒泡的轮数
// 控制冒泡
for (int j = 0; j < arrLen - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
for (int i = 0; i < arrLen; i++) {
cout << arr[i] << endl;
}
// system("dir");
system("pause");
return 0;
}
vector
- 数组的长度固定,且越界操作可能带来未知的风险,故对数组扩展,得到vector,array;
- vector容器,也是相同类型的数据的集合,长度可变,但性能降低;
- array容器,也是相同类型的数据的集合,长度固定,但性能降低;
#include <vector>
#include <array>
using namespace std; // 必须包含头文件,并使用std
int main() {
// 容器是对数组的扩展,不定长用vector, 定长用array (也是扩展的数组)
// 拷贝初始化
vector<int> cont1 = {
1, 2, 3};
vector<float> cont2{
34.5, 46.7 }; // 赋值号可省略
// 直接初始化
vector<double> cont3(5); // 指定长度为5 可以继续添加数据,扩展长度
vector<string> cont4(3, "jack"); // 长度为3,且默认值均为"jack"
// 容器 通过索引访问,修改
for (int i = 0; i < cont1.size(); i++) {
cout << cont1[i] << "\t";
}
// 添加
cont1.push_back(100); // 尾部添加
//cont1.pop_back(); // 尾部删除
for (int e : cont1) {
cout << e << " ";
}
// 基于数组扩展的array , 固定长度
array<string, 5> userList = {
"jack", "tom", "lucy" }; // 赋值也可省略
// array<string, 5> userList;
// userList = { "jack", "tom", "lucy" }; // 先声明,再赋值 userList.size() 长度
for (string e : userList) {
cout << e << " ";
}
return 0;
}
字符串
- string类型,也是一个容器,内容可变,通过索引访问每个字符;
- size()方法获取长度,size() - 1是最后一个索引;同数组,也不能越界访问/赋值
- 支持两种for循环
#include <string>
using namespace std;
int main() {
// c++ 中的string是可变的容器,而python的str是不可变的容器
string name; //初始化为空
string sex = "male"; //拷贝初始化
string addr("wuhan province"); // 直接初始化
// 普通的for
for (int i = 0; i < addr.size(); i++) {
cout << addr[i] << " "; // 索引访问每个字符
}
// 元素遍历的for
for (char e : addr) {
cout << e << " ";
}
return 0;
}
- 字符串的拼接
- 字符串变量 + 字符串变量;
- 字符串变量 + 字符串字面量;
字符串字面量 + 字符串字面量
(X); 不同于python
- 字符串的比较
- ==、> >= < <= 逐字符比较;
结构体
pass
枚举
pass
指针
pass
引用
pass
综合案例
pass