练习:
3.16:编写一段程序,把练习3.13中vector对象的容量和具体内容输出出来。检验你之前的回答是否正确,如果不对,回过头重新学习3.3.1节直到弄明白错在何处为止。
【解答】:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<int> v1;
vector<int> v2(10);
vector<int> v3(10,42);
vector<int> v4{10};
vector<int> v5{10, 42};
vector<string> v6{10};
vector<string> v7{10, "hi"};
cout << "v1的元素个数是:" << v1.size() << endl;
if(v1.size() > 0) // 当vector含有元素时逐个输出
{
cout << "v1的元素分别是:" << endl;
for(auto e : v1) // 使用范围for语句遍历每一个元素
cout << e << " ";
cout << endl;
}
cout << "v2的元素个数是:" << v2.size() << endl;
if(v2.size() > 0) // 当vector含有元素时逐个输出
{
cout << "v2的元素分别是:" << endl;
for(auto e : v2) // 使用范围for语句遍历每一个元素
cout << e << " ";
cout << endl;
}
cout << "v3的元素个数是:" << v3.size() << endl;
if(v3.size() > 0) // 当vector含有元素时逐个输出
{
cout << "v3的元素分别是:" << endl;
for(auto e : v3) // 使用范围for语句遍历每一个元素
cout << e << " ";
cout << endl;
}
cout << "v4的元素个数是:" << v4.size() << endl;
if(v4.size() > 0) // 当vector含有元素时逐个输出
{
cout << "v4的元素分别是:" << endl;
for(auto e : v4) // 使用范围for语句遍历每一个元素
cout << e << " ";
cout << endl;
}
cout << "v5的元素个数是:" << v5.size() << endl;
if(v5.size() > 0) // 当vector含有元素时逐个输出
{
cout << "v5的元素分别是:" << endl;
for(auto e : v5) // 使用范围for语句遍历每一个元素
cout << e << " ";
cout << endl;
}
cout << "v6的元素个数是:" << v6.size() << endl;
if(v6.size() > 0) // 当vector含有元素时逐个输出
{
cout << "v6的元素分别是:" << endl;
for(auto e : v6) // 使用范围for语句遍历每一个元素
cout << e << " ";
cout << endl;
}
cout << "v7的元素个数是:" << v7.size() << endl;
if(v7.size() > 0) // 当vector含有元素时逐个输出
{
cout << "v7的元素分别是:" << endl;
for(auto e : v7) // 使用范围for语句遍历每一个元素
cout << e << " ";
cout << endl;
}
return 0;
}
3.17:从cin读入一组词并把它们存入一个vector对象,然后设法把所有词都改写为大写形式。输出改变后的结果,每个词占一行。
【解答】:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<string> vString; // 元素类型为string的vector对象
string s; // 记录用户的输入值
char cont = 'y'; // 与用户交互,决定是否继续输入
cout << "请输入第一个词:" << endl;
while(cin >> s)
{
vString.push_back(s); // 向vector对象中添加元素
cout << "您要继续吗(y or n)?" << endl;
cin >> cont;
if(cont !='y' && cont != 'Y')
break;
cout << "请输入下一个词:" << endl;
}
cout << "转换后的结果是:" << endl;
for(auto &mem : vString) // 使用范围for循环语句遍历vString中的每个元素
{
for(auto &c : mem) // 使用范围for循环语句遍历mem中的每个字符
c = toupper(c); // 改写为大写字母形式
cout << mem << endl;
}
return 0;
}
3.18:下面的程序合法吗?如果不合法,你准备如何修改?
vector<int> ivec;
ivec[0] = 42;
【解答】:
该程序是非法的,因为ivec目前没有任何元素,因此ivec[0]的形式是错误的,程序试图访问的元素根本不存在。要想向vector对象中添加新元素,需要使用push_back函数。
下面是修改后的程序代码:
vector<int> ivec;
ivec.push_back(42);3.19:如果想定义一个含有10个元素的vector对象,所有元素的值都是42,请列举三种不同的实现方法。哪种方法更好?为什么?
【解答】:
解决思路一:先定义一个空vector对象,然后添加元素
vector<int> vInt;
for(int i = 0; i < 10; i++)
vInt.push_back(42);
解决思路二:列表初始化,罗列出全部10个元素的值。
vector<int> vInt = {42,42,42,42,42,42,42,42,42,42};
解决思路三:用括号给出所有元素的值,效果类似于解决思路二。
vector<int> vInt{42,42,42,42,42,42,42,42,42,42};
解决思路四:定义的时候使用参数指定元素个数及重复的值。
vector<int> vInt(10, 42);
解决思路五:先指定元素个数,再利用范围for循环依次为元素赋值。
vector<int> vInt(10);
for(auto &i : vInt)
i = 42;
显然,思路四采用的初始化方式形式上最简洁直观,当vector对象的元素数量较多且取值重复时是最好的选择:而思路一在开始的时候不限定元素的个数,比较灵活。3.20:读入一组整数并把它们存入一个vector对象,将每对相邻整数的和输出出来。改写你的程序,这次要求先输出第一个和最后1个元素的和,接着输出第2个和倒数第2个元素的和,以此类推。
【解答】:
// 求相邻元素和的程序如下所示
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vInt;
int iVal;
cout << "请输入一组数字:" << endl;
while (cin >> iVal)
vInt.push_back(iVal);
if (vInt.size() == 0) {
cout << "没有任何元素" << endl;
return -1;
}
cout << "相邻两项的和依次是:" << endl;
// 利用decltype判断i的类型
for (decltype(vInt.size()) i = 0; i < vInt.size() - 1; i += 2) {
// 求相邻两项的和
cout << vInt[i] + vInt[i + 1] << " ";
// 每行输出5个数字
if ((i + 2) % 10 == 0)
cout << endl;
}
// 如果元素数是奇数,单独处理最后一个元素
if (vInt.size() % 2 != 0)
cout << vInt[vInt.size() - 1];
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vInt;
int iVal;
cout << "请输入一组数字:" << endl;
while (cin >> iVal)
vInt.push_back(iVal);
if (vInt.size() == 0) {
cout << "没有任何元素" << endl;
return -1;
}
cout << "首尾两项的和依次是:" << endl;
// 利用decltype判断i的类型
for (decltype(vInt.size()) i = 0; i < vInt.size() / 2; i++) {
// 求相邻两项的和
cout << vInt[i] + vInt[vInt.size() - i - 1] << " ";
// 每行输出5个数字
if ((i + 1) % 5 == 0)
cout << endl;
}
// 如果元素数是奇数,单独处理最后一个元素
if (vInt.size() % 2 != 0)
cout << vInt[vInt.size() / 2];
return 0;
}
版权声明:本文为McKenzie原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。