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 @ 2022-07-30 17:17  hugeYlh  阅读(12)  评论(0编辑  收藏  举报  来源