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
                    
                
                
            
        
浙公网安备 33010602011771号