练习3.21 请使用迭代器重做3.3.3节的第一个练习。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
void check_and_print(vector<int> &vec, int num)
{
cout << "v" << num << ": "<< vec.capacity() << endl;
for (auto i = vec.cbegin(); i != vec.cend(); i++)
cout << *i << " ";
cout << endl;
}
void check_and_print(vector<string> &vec, int num)
{
cout << "v" << num << ": " << vec.capacity() << endl;
for (auto i = vec.cbegin(); i != vec.cend(); i++)
cout << *i << " ";
cout << endl;
}
int main()
{
vector<int> v1; // size:0, no values.
vector<int> v2(10); // size:10, value:0
vector<int> v3(10, 42); // size:10, value:42
vector<int> v4{ 10 }; // size:1, value:10
vector<int> v5{ 10, 42 }; // size:2, value:10, 42
vector<string> v6{ 10 }; // size:10, value:""
vector<string> v7{ 10, "hi" }; // size:10, value:"hi"
check_and_print(v1, 1);
check_and_print(v2, 2);
check_and_print(v3, 3);
check_and_print(v4, 4);
check_and_print(v5, 5);
check_and_print(v6, 6);
check_and_print(v7, 7);
return 0;
}
之前犯蠢了,原来是让用迭代器重做94页最后一个练习
#include<vector>
#include<iostream>
using namespace std;
int main()
{
int temp;
vector<int> vec;
while (cin >> temp) {
vec.push_back(temp);
}
for (auto iter = vec.begin() + 1; iter < vec.end(); ++iter) {
cout << *(iter - 1) + *iter << " ";
}
cout << endl;
return 0;
}
#include<vector>
#include<iostream>
using namespace std;
int main()
{
int temp;
vector<int> vec;
while (cin >> temp) {
vec.push_back(temp);
}
for (auto iter = vec.begin(); iter < vec.end(); ++iter) {
cout << *(vec.end() - iter + vec.begin() - 1) + *iter << " ";
}
cout << endl;
return 0;
}
练习3.22 修改之前那个输出text第一段的程序,首先把text的第一段全部改成大写形式,然后输出它。
#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;
int main()
{
vector<string> text;
text.push_back("aaaaaaaaaa aaaaaaaaa aaaaaa");
text.push_back("");
text.push_back("bbbbbbbbbbbbbb bbbbbbbbbbb bbbbbbbbbbbbb");
for (auto i = text.begin(); i != text.end() && !i->empty(); i++)
for (auto &c : *i)
c = toupper(c);
for (auto i = text.cbegin(); i != text.end(); i++)
cout << *i << " ";
cout << endl;
return 0;
}
练习3.23 编写一段程序,创建一个含有10个整数的vector对象,然后使用迭代器将所有元素的值都变成原来的两倍。输出vector对象的内容,检验程序是否正确。
#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;
int main()
{
vector<int> vec(10, 42);
for (auto i = vec.begin(); i != vec.end(); i++)
{
*i = (*i) * 2;
}
for (auto i = vec.cbegin(); i != vec.end(); i++)
cout << *i << " ";
cout << endl;
return 0;
}
练习3.24 请使用迭代器重做3.3.3节的最后一个练习。
#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;
int main()
{
vector<int> vec;
int temp;
while (cin >> temp)
{
vec.push_back(temp);
}
if (vec.begin() != vec.end())
{
for (auto i = vec.cbegin(); i != vec.end() - 1; i++)
cout << *i + *(i + 1) << " ";
}
cout << endl;
return 0;
}
#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;
int main()
{
vector<int> vec;
int temp;
while (cin >> temp)
{
vec.push_back(temp);
}
if (vec.begin() != vec.end())
{
for (auto i = vec.cbegin(); i != vec.end(); i++)
cout << *i + *(vec.end() - 1 - (i-vec.begin())) << " ";
}
cout << endl;
return 0;
}
练习3.25 3.3.3节划分分数段的程序是使用下标运算符实现的,请利用迭代器改写该程序实现完全相同的功能。
#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;
int main()
{
vector<int> vec(11, 0);
int temp;
while (cin >> temp)
{
if (temp <= 100)
++(*(vec.begin() + temp / 10));
}
for (auto i = vec.begin(); i != vec.end(); ++i)
cout << *i << " ";
cout << endl;
return 0;
}
练习3.26 在100页的二分搜索程序中,为什么用的是 mid = beg + (end - beg) / 2
, 而非 mid = (beg + end) / 2 ;
?
因为迭代器之间支持的运算只有’-’,而没有’+’。end-beg
指相距若干元素,将它除以2之后与beg相加,表示移动到一beg与end中间的位置。
练习3.27 假设txt_size 是一个无参函数,它的返回值是int
。请回答下列哪个定义是非法的,为什么?
unsigned buf_size = 1024;
(a) int ia[buf_size];
(b) int ia[4 * 7 - 14];
(c) int ia[txt_size()];
(d) char st[11] = "fundamental";
a非法,buf_size
不是常量表达式
b合法
c非法,txt_size()
返回值不是常量表达式
d非法,没有空间存放空字符
练习3.28 下列数组中元素的值是什么?
string sa[10]; //十个空字符串
int ia[10]; //十个为0的int型变量
int main() {
string sa2[10];//十个空字符串
int ia2[10]; //十个未定义的值
}
练习3.29 相比于vector
来说,数组有哪些缺点,请例举一些。
数组的大小是确定的,且不可扩展
数组间不能拷贝和赋值
数组本身没有方法可以使用
练习3.30 指出下面代码中的索引错误。
constexpr size_t array_size = 10;
int ia[array_size];
for (size_t ix = 1; ix <= array_size; ++ix)
ia[ix] = ix;
访问越界