C++新增的操作 数组 向量 字符串
基于C++ primer的第三章的总结
对于string对象有关的计数等操作
-
string对象的有关操作返回一个无符号整型数
-
int和unsigned混用会产生意想不到的结果
-
使用decltype(s.size()) 来推断出计数的变量的类型
基于范围的for语句
- 使用c变量对s对象序列执行cout操作
string s{ "daw dawd da" }; for (auto c : s) { cout << c; }
- 使用引用会将变量绑定到每一个字符 ,将每个字母转换为大写字母
string s{ "daw dawd da" }; for (auto& c : s) { c = toupper(c); } cout << s << endl;
-
范围for语句来操作二维数组 除了最内层循环 ,所有auto控制变量都要加&操作符
constexpr int row = 5; constexpr int col = 3; int ar[row][col]{ 0 }; //赋值 int i = 0; for (auto& row : ar) { for (auto& col : row) { col = i++; } } /* 此处只读操作加const auto& 的原因是: 防止将数组自动转换为指针 */ for (const auto& row : ar) { for (auto& col : row) { cout << col << " "; } cout << '\n'; }
标准库类型vector
-
根据模板创建类和函数的过程称为实例化
-
列表初始化还是元素数量?
- 圆括号: 构造对象
- 花括号: 列表值初始化
- 如果花括号中元素类型与容器不符,则为构造对象
//圆括号: 有10个元素,每个元素默认为0 vector<int> v2(10); //花括号: 有1个元素,该元素是10 vector<int> v1{10}; vector<int> v1{10,2}; //有两个元素,值分别是 10 2 vector<int> v1(10,1); //有10个元素,每个元素都是1 -
向容器中push_back添加元素时,无法使用基于范围for语句
-
只能对已经存在的vector对象的下标执行操作
-
实例:
- 输入单词往v3 ,并且把每个单词转换为大写再输出
#include <iostream> #include <string> #include <cctype> #include <vector> using namespace std; int main() { string word; vector<string> v3; while (cin >> word) v3.push_back(word); for (decltype(v3.size())i = 0; i < v3.size();i++) { for (auto& x : v3[i]) { x = toupper(x); } } for (auto x : v3) { cout << x << endl; } return 0; } -
使用数组来初始化vector对象 当然也可以是数组的一部分
const int arr[] = { 1,2,3,4,5,6,7,8,9 }; vector<int> a(begin(arr), end(arr));
迭代器
-
提供一种方法来像下标访问一样访问容器的方法
-
所有的标准库容器都具有迭代器,所有的迭代器都定义了== 和 != ,但是不一定定义了< > 等运算符,所以在使用迭代器时for循环时要使用 !=
-
使用迭代器 begin表示第一个元素的迭代器; end表示尾迭代器,指向最后一个元素的下一个元素
vector<int> v3(10,5); for (auto x = v3.begin(); x != v3.end(); x++) { cout << *x << " "; } -
像指针一样,*解引用迭代器来获得迭代器指向的值
-
定义迭代器对象
//迭代器的类型 //读写vector对象 vector<int>::iterator it; //只读vector对象,相当于常量指针 vector<int>::const_iterator it; -
cbegin 和 cend 返回 const_iterator的迭代器 表示只读
-
迭代器的运算操作
//使用迭代器进行二分查找 vector<int> text; for (int i = 0; i < 10; i++) { text.push_back(i); } int s = 0; auto beg = text.begin(), end = text.end(); auto middle = text.begin() + (end - beg) / 2; while (middle != end && *middle != s) { if (s < *middle) { end = middle; } else { beg = middle + 1; } middle = beg + (end - beg) / 2; } cout << *middle << endl; -
迭代器显示二维数组
constexpr int row = 5; constexpr int col = 3; int ar[row][col]{ 0 }; //迭代器赋值 int i = 0; for (auto row=begin(ar);row!=end(ar);++row) { for(auto col=begin(*row);col!=end(*row); col++) { *col = i++; } } //迭代器显示 for (auto p = begin(ar); p != end(ar); ++p) { for (auto q = begin(*p); q != end(*p); ++q) { cout << *q << " "; } cout << endl; }
使用多种不同的方式 赋值 访问二维数组
constexpr int row = 5; constexpr int col = 3; int ar[row][col] = { {1,2,3} , {2,3,4}, {3,4,5}, {4,5,6}, {5,6,7} }; /* 不使用 auto 类型别名 decltype关键字 */ //范围for for (const int(&x)[col] : ar) { for (int y : x) { cout << y << " "; } cout << '\n'; } //数组下标 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { cout << ar[i][j]<<" "; } cout << '\n'; } //指针 for (int(*p)[col] = ar; p != ar + row; p++) { for (int* q = *p; q != (*p) + col; q++) { cout << *q << " "; } cout << '\n'; } //迭代器 for (int(*p)[col] = begin(ar); p != end(ar); p++) { for (int* q = begin(*p); q != end(*p); q++) { cout << *q << " "; } cout << '\n'; }
本文来自博客园,作者:hugeYlh,转载请注明原文链接:https://www.cnblogs.com/helloylh/p/17209755.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)