vector用法(个人笔记)

// 01.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
	//练习3.12 检查vector对象的定义是否正确
	vector<vector<int>> ivec;//ivec 是一个整数向量
	vector<vector<string>> svec = ivec;//错误  svec 是一个字符串向量
	vector<string> svec{ 10,"null" };

	//练习 3.13 vector对象包含的元素,这些元素的值分别是多少
	vector<int> v1; //包含的元素为0个
	vector<int> v2(10);//v2有10个元素,每个元素的值为0
	vector<int> v3(10,42);//v3有10个元素,每个元素的值为42
	vector<int> v4{10};//*******v4有1个元素,初始值为10
	vector<int> v5{10,42};//v5有2个元素,初始值分别为10和42
	vector<string> v6{10};//******v6有10个默认初始化的元素
	//花括号里面的值必须与元素类型相同,显然不能用int初始化string对象,编译器确认无法执行列表初始化后编译器尝试用默认值初始化vector对象
	//vector<string> v7{10,"hi"};//v7有10个值为hi的元素

	//向vector对象添加元素

	vector<int> v2; //空vector对象
	for (int i = 0; i != 100; ++i)
	{
		v2.push_back(i);//依次把整数放到尾端
	}
	for (int i = 0; i < v2.size(); ++i) {
		cout << v2[i] << " " << endl; //打印每个元素
	}

	//运行时知道vector对象中元素的确切个数,例如实时读入数据然后将其赋给vector对象
	string word;
	vector<string> text;
	while (cin >> word){
		text.push_back(word);
	}
	for (int i = 0; i < text.size(); ++i) {
		cout << text[i] << " "; //打印每个元素
	}

	//使用范围for语句处理vector对象中的所有元素
	vector<int> v{ 1,2,3,4,5,6,7,8,9 };
	cout << &v << endl;
	cout << endl;
	for (auto & i: v)//让循环变量直接引用容器中的元素,而不是元素的副本
	{
		i *= i;

		cout << &i << endl;
		cout << &v<< endl;
		cout << i << endl; //加了引用,其操作对象元素本身
	}
	cout << endl;
	for (auto i : v)//让循环变量直接引用容器中的元素,而不是元素的副本
	{
		i *= i;
		cout << &i << endl;
		cout << i << endl;//未加引用 ,操作副本元素
	}
	for (auto & i : v)
		cout << i << endl;

	//以10分为分数段统计成绩的数量
	vector<unsigned> scores(11, 0);//11个分数段,全部初始化为0
	unsigned grade;
	while (cin >> grade) {
		if (grade <= 100)
			++scores[grade / 10];
	}
	for (auto i : scores) {//让循环变量直接引用容器中的元素,而不是元素的副本
		cout << i << endl;//未加引用 ,操作副本元素
	}

	// 一不能下标形式添加元素
	vector<int> ivec;
	for (decltype(ivec.size())ix = 0; ix != 10; ix++)
		ivec[ix] = ix;//严重错误,ivec不包含任何元素,当然也就不能通过下标去访问任何元素
	for (auto i : ivec) {//让循环变量直接引用容器中的元素,而不是元素的副本
		cout << i << endl;//未加引用 ,操作副本元素
	}

	//二 正确的办法用push_back();
	vector<int> ivec;
	for (decltype(ivec.size())ix = 0; ix != 10; ix++)
		ivec.push_back(ix);
	for (auto i : ivec) {//让循环变量直接引用容器中的元素,而不是元素的副本
		cout << i << endl;//未加引用 ,操作副本元素
	}
	//**vector对象(string对象)下标用于访问已经存在的元素,而不能用于添加元素
	//提示:只能对确知已存在的元素执行下标操作 例如

	vector<int> ivec;
	cout << ivec[0];//错误,ivec不包含任何元素
	vector<int> ivec2(10);//含有10个元素的vector对象
	cout << ivec2[10];//错误,ivec2元素的合法索引是0-9

	//3.17
	vector<string> words;
	string word;
	while (cin >> word) {
		words.push_back(word);
	}
	for (auto& w : words) {
		transform(w.begin(), w.end(), w.begin(),toupper);
		cout << w << std::endl;
	}
	for (auto& w : words) {
		for (auto& c : w) {
			c = toupper(c);
		}
		cout << w << std::endl;
	}

	//练习3.18 下面的程序是否合法,不合法请改正
	//vector<int> ivec;
	//ivec[0] = 42;//不合法 vector<int> ivec;声明了一个空的整数向量,然后试图访问并赋值给第一个元素,这是错误的。
	//正确的应该是
	//ivec.push_back(42);

	//3.19首先需要读取一组整数,然后将它们存储在一个vector对象中。接着遍历这个vector,计算每对相邻整数的和并输出。
	vector<int> nums;
	int n, input;
	cout << "请输入整数个数: ";
	cin >> n;

	cout << "请输入" << n << "个整数: ";
	for (int i = 0; i < n; ++i) {
		cin >> input;
		nums.push_back(input);
	}

	cout << "相邻整数之和为: ";
	for (int i = 0; i < n - 1; ++i) {
		cout << nums[i] + nums[i + 1] << " ";
	}
	cout << endl;

	cout << "相向整数之和: ";
	for (int i = 0; i < n - 1; ++i) {
		cout << nums[i] + nums[n-1-i] << " ";
	}
	cout << endl;

	//迭代器类型
	
	vector<int>::iterator it;//it能读写vector<int>的元素
	string::iterator it2;    //it2能读写string对象的字符

	vector<int>::const_iterator it3;//it3只能读元素,不能写元素
	string::const_iterator it4;     //it4只能读字符,不能写字符
	
	// begin 和 end 运算符
	//begin 和 end 返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回的是iterator_const
	//如果不是常量,返回的是iterator
	
	
	vector<int> v;
	const vector<int> cv;
	auto it1 = v.begin();//it1的类型是vector<int>::iterator
	auto it2 = cv.begin();//it2的类型是vector<int>::const_iterator;
	
	/*为了便于专门得到const_iterator类型的返回值,c++11新标准引入两个新函数,分别是cbegin()和cend();
	* 无论vector或者(string)对象是否是常量,返回值都是const_iterator;
	*/
	//auto it3 = v.cbegin();//it3的类型是vector<int>::const_iterator;
	/*c++语言定义了箭头运算符(->),将解引用操作和成员访问操作结合在一起,也就是说it->men,和(*it).men表达的意思相同
	*/
	//helloworld welcome 依次输出每一行,遇空格跳过
	
	vector<string> text;
	string word;
	while (cin >> word){
		text.push_back(word);
	}
	for (auto it = text.cbegin(); it != text.cend() && !it->empty(); ++it)
		cout << *it << endl;
	
	/*
	己 知 的 一 个 限 制 是 不 能 在 范 围 for 循 环 中 向 vector 对 象 添 加 元 素 。 另 外 一 个 限 制 是 任 何 一 种 可 能 
	改 变 vector 对 象 容 量 的 操 作 , 比 如 push_back' 都 会 使 该 vector 对 象 的 迭 代 器 失 效 ·  将 详 细 解 释 迭 代 器 
	是 如 何 失 效 的
	*但凡使用了迭代器的循环体,都不要向迭代器所属的容器添加元素
	*/
	


};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值