C++Primer 中文版 第五版 第九章课后习题答案

//9.1
list
deque
vector
//9.2
list<deque<int>>ilist
//9.3
左闭合区间
//9.4
bool hanshu(vector<int>::iteator first,vecot<int>::iteator end,int t)
{
for(first!=end)
{
if(t==*first)
return true;
++first;
}
return false;
}


//9.5
vector<int>::iterator hanshu(vector<int>::iterator first,vecot<int>::iterator end,int t)
{
for(first!=end)
{
if(t==*first)
return first;
++first;
}
return 0;
}
//9.6
迭代器不能<,只能用!=
//9.7
vector<int>::size_type
//9.8
list<string>::iterator iter
//9.9
c的返回const迭代器
//9.10
int
const int
vector<int>::iterator
vector<const int>::iterator
//9.11

//9.12
接受迭代器的不要求容器类型相同
//9.13
利用迭代器的即可
//9.14
list<char *>names;
vector<string>old;
names.assign(old.begin(),old.end());
   




//9.15
#include<iostream>
#include<list>
#include<vector>
using namespace std;
int main()
{
vector<int>a;
vector<int>b;
int i;
for(i=0;i<5;i++)
{
a.push_back(i);
b.push_back(i);
}
if(a==b)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
   




}
//9.16
#include<iostream>
#include<list>
#include<vector>
using namespace std;
int main()
{
list<int>a;
vector<int>b;
int flag=1;
int i;
for(i=0;i<5;i++)
{
a.push_back(i);
b.push_back(i);
}
list<int>::iterator it=a.begin();
for(i=0;i<5;i++)
{
if(*it!=b[i])
{
flag=0;
cout<<"no"<<endl;
break;
}
++it;
}
if(flag)
cout<<"yes"<<endl;
   




}
//9.17
c1与c2的容器类型必须相同而且必须还支持<关系运算
//9.18
#include<iostream>
#include<list>
#include<deque>
#include<vector>
#include<string>
using namespace std;
int main()
{
string str;
int j=5;
deque<string>a;
while(j--)
{
cin>>str;
a.push_back(str);
}
deque<string>::iterator it=a.begin();
deque<string>::iterator it2=a.end();
while(it!=it2)
{
cout<<*it<<endl;
++it;
}
}
//9.19
#include<iostream>
#include<list>
#include<deque>
#include<vector>
#include<string>
using namespace std;
int main()
{
string str;
int j=5;
list<string>a;
while(j--)
{
cin>>str;
a.push_back(str);
}
list<string>::iterator it=a.begin();
list<string>::iterator it2=a.end();
while(it!=it2)
{
cout<<*it<<endl;
++it;
}
}
//9.20
#include<iostream>
#include<vector>
#include<string>
#include<deque>
#include<list>
using namespace std;
int main()
{
list<int> ilist = {1,2,3,4,5,6,7,8,9};
deque<int> odd_deque, even_deque;
for (auto iter = ilist.begin(); iter != ilist.end(); ++iter)
{
if (*iter % 2 == 0)
even_deque.push_back(*iter);
else
odd_deque.push_back(*iter);
}
for (auto iter = odd_deque.begin(); iter != odd_deque.end(); ++iter)
cout << *iter << ' ';
cout << endl;
for (auto iter = even_deque.begin(); iter != even_deque.end(); ++iter)
cout << *iter << ' ';
cout << endl;
return 0;
}
//9.21
第一次插入的时候初始化了iter,把读入的string插入到iter所指的元素之前的位置,其insert返回指向这个新插入元素的迭代器,每读入一次string,重复上述工作
//9.22
vector<int>::iterator iter = iv.begin(), mid = iv.begin() + iv.size / 2;
while (iter != mid)
{
if (*iter == some_val)
{
iv.insert(iter, 2 * some_val);
iter += 2;
}
else
++iter;
}


//9.23
值都是相同的
//9.24


#include<iostream>
#include<list>
#include<deque>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<int>a;
a.push_back(5);
cout<<a[0]<<endl;
cout<<a.at(0)<<endl;
vector<int>::iterator it=a.begin();
cout<<*it<<endl;
cout<<a.front()<<endl;
}
//9.25
int main()
{
vector<int> ivec{ 3, 1 };
ivec.erase(ivec.begin(),ivec.begin());
for (auto i : ivec)
cout << i << endl;
}
//9.26
#include<iostream>
#include<vector>
#include<list>
using namespace std;
int main()
{
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55,89 };
vector<int> ivec(ia, ia + 11);
list<int> ilist(ia, ia + 11);
for (auto iter = ilist.begin(); iter != ilist.end(); ++iter)
{
if (*iter % 2 == 1)
{
iter = ilist.erase(iter);
iter--;
}
}
for (auto iter = ivec.begin(); iter != ivec.end(); ++iter)
{
if (*iter % 2 == 0)
{
iter = ivec.erase(iter);
}
}
for (auto i : ilist)
cout << i << ' ';
cout << endl;
for (auto i : ivec)
cout << i << ' ';
cout << endl;
return 0;
}
//9.27


#include<iostream>
#include<forward_list>
using namespace std;
int main()
{
forward_list<int> iforward_list{0,1,2,3,4,5,6,7,8,9};
auto prev = iforward_list.before_begin();
auto curr = iforward_list.begin();
while (curr != iforward_list.end())
{
if (*curr % 2)
{
curr = iforward_list.erase_after(prev);
}
else
{
prev = curr;
++curr;
}


}
for (auto i : iforward_list)
cout << i << ' ';
cout << endl;
return 0;
}
//9.28
#include<iostream>
#include<vector>
#include<string>
#include<deque>
#include<list>
#include<forward_list>
using namespace std;


void my_insert(forward_list<string> &f, const string &s1,const string &s2)
{
auto prev = f.before_begin();
auto curr = f.begin();
while (curr != f.end())
{
if (*curr == s1)
{ f.insert_after(curr, s2);
return;
}
else
{
prev = curr;
++curr;
}
}
f.insert_after(prev,s2);
return;
}//这里必须有return,Google很好用!


int main()
{
forward_list<string> my_vector{ "chen", "xun", "is", "an","student" };
my_insert(my_vector, "anqq", "excellent");
my_insert(my_vector, "student", ",oh yeah!");
for (auto &a : my_vector)
cout << a << ' ';
cout << endl;
return 0;
}
9.29
加到100,减去90
//9.30
必须支持默认初始化
//9.31
#include<iostream>
#include<vector>
#include<forward_list>
using namespace std;


int main()
{
vector<int> vi{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
auto iter = vi.begin();
while (iter != vi.end())
{
if (*iter % 2==1)
{
iter = vi.insert(iter, *iter);
iter += 2;
}
else
iter = vi.erase(iter);
}
for (auto i : vi)
cout << i << ' ';
cout << endl;


forward_list<int> ilist{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
auto prev = ilist.cbefore_begin();
auto curr = ilist.begin();
while (curr != ilist.end())
{
if (*curr % 2 == 0 )
{
curr = ilist.erase_after(prev);
}
else
{
curr = ilist.insert_after(curr, *curr);
prev = curr;
++curr;
}

}
for (auto i : ilist)
cout << i << ' ';
cout << endl;
}
//9.32
iter指向尾后时非法
//9.33
未定义的行为。运行错误
//9.34
忘了加大括号啦
.35答:capacity表示容易在重新分配空间之前的可以容纳元素的个数,而seize表示容器当前所存储的元素的个数。
9.36答:capacity只能大于等于size。
9.37答:list不需要对内存重新分配,在插入元素的对对数据分配空间就可以,然后把数据链接到list中就可以了。
9.38答:push_back、resize、capacity。
9.39答:将svec的capacity至少为1024,然后从输入设备添加元素,然后将其大小改成其读入的word个数的1.5倍。
9.40答:当读入256或512个数的时候capacity是1024.读入1000个的时候变成1536.读入1048的时候变成2034.
//9.41
#include<iostream>
#include<list>
#include<deque>
#include<vector>
#include<string>
using namespace std;
int main()
{
     char c;
vector<char>a;
while(cin>>c)
{
a.push_back(c);
}
string s(a.begin(),a.end());
cout<<s<<endl;
}
//
9.42
提前reserve(100)
//9.47
#include<iostream>
#include<list>
#include<deque>
#include<vector>
#include<string>
using namespace std;
int main()
{
     char c;
vector<char>a;
while(cin>>c)
{
a.push_back(c);
}
string s(a.begin(),a.end());
cout<<s<<endl;
}
//9.48
不一定
//9.49


#include<iostream>
#include<string>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
string::size_type pos=0;
string word;
vector<string> svec;
string s1 = "bfghjlklpqty";
fstream myfile("chen.txt");
while (myfile >> word)
{
pos = word.find_first_of(s1);
if (pos == -1)
svec.push_back(word);
}
for (auto i : svec)
cout << i << endl;
string::size_type maxlen=0;
auto iter = svec.begin();
while (iter != svec.end())
{
auto theVal = (*iter).size();
if (theVal > maxlen)
{
maxlen = theVal;
}
++iter;
}
cout << maxlen << endl;;
for (auto iter1 = svec.begin(); iter1 != svec.end();++iter1)
{
if ((*iter1).size() == maxlen)
{
cout << *iter1 << endl;
}
}
return 0;
}
//9.50
不会..
//9.51
vector中存储是表示int型的字符串”123”、”123456”,那么就用stoi,如果存储的表示是浮点型就stod或者stof。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值