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';
}
posted @   hugeYlh  阅读(18)  评论(0编辑  收藏  举报  
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示