9.1
a)list,字典顺序极大可能要从中间插入顺序
b)deque,双端队列头尾插入删除很快
c)vector,没有更多的操作,因此没有更好的选择
9.2
list<deque<int> > l
9.3
指向同一个容器中的元素,前一个迭代器指向的元素不能在后一个迭代器指向的元素之后
9.4
#include <iostream>
#include <vector>
using namespace std;
bool find_i(vector<int>::iterator begin, vector<int>::iterator end, int n)
{
if (begin > end)
return false;
while (begin != end)
{
if (n == *begin)
return true;
++begin;
}
return false;
}
9.5
#include <iostream>
#include <vector>
using namespace std;
vector<int>::iterator find_i(vector<int>::iterator begin, vector<int>::iterator end, int n)
{
if (begin > end)
return end;
while (begin != end)
{
if (n == *begin)
return begin;
++begin;
}
return end;
}
9.6
空链表,iter1与iter2相等,条件while永远不成立,并且while函数体应该递增iter1的值,确定循环最终会结束
9.7
vector<int>::iterator
9.8
list<string>::const_iterator
list<string>::iterator
9.9
cbegin返回const迭代器,当不需要写访问时,使用cbegin
9.10
it1 vector<int>::iterator it2 vector<int>::const_iterator
it3 vector<int>::const_iterator it4 vector<int>::const_iterator
9.11
1)vector<int> v1;空vector
2)vector<int> v2={1,2,3};
3)vector<int> v3(v2);
4)vector<int>v4(v3.begin(),v3.end())
5)vector<int> v5(5) ; 包含5个0
6)vector<int> v6(5,1);包含5个1
9.12
接受一个容器创建其拷贝的构造函数要求2个容器类型及其元素类型必须匹配;
接受两个迭代器创建拷贝的构造函数则只要求将要拷贝的元素可以转换为要初始化的容器的元素类型
9.13
#include <iostream>#include <vector>
#include<list>
using namespace std;
int main()
{
list<int> li(10,1);
vector<int> veci(6,1);
vector<double> vecd(li.begin(), li.end());
vector<double> vecd1(veci.begin(), veci.end());
for (auto i : vecd)
cout << i << ",";
cout << endl;
for (auto i : vecd1)
cout << i << ",";
return 0;
}
9.14
#include<iostream>
#include<list>
#include<vector>
#include<string>
using namespace std;
int main()
{
list<char*> li{ "haha","hoho","hehe" };
vector<string> vs(li.begin(), li.end());
for (auto s : vs)
cout << s << " ";
return 0;
}
9.15
return v1==v2;
9.17
两个容器类型必须相同,并且保存的是相同的元素
9.18
#include<iostream>
#include<string>
#include<deque>
using namespace std;
int main()
{
deque<string> ds;
string s;
while (cin >> s)
{
ds.push_back(s);
}
auto iter1 = ds.begin();
auto iter2 = ds.end();
while (iter1 != iter2)
cout << *iter1++ << ",";
return 0;
}
9.19
#include<iostream>
#include<string>
#include<list>
using namespace std;
int main()
{
list<string> ls;
string s;
while (cin >> s)
{
ls.push_back(s);
}
auto iter1 = ls.begin();
auto iter2 = ls.end();
while (iter1 != iter2)
cout << *iter1++ << ",";
return 0;
}
9.20
#include<iostream>
#include<string>
#include<list>
#include<deque>
using namespace std;
int main()
{
list<int> l={ 1,2,3,4,5 };
deque<int> deven, duneven;
auto iter1 = l.begin(), iter2 = l.end();
while (iter1 != iter2)
{
if (*iter1 % 2)
duneven.push_back(*iter1);
else
deven.push_back(*iter1);
++iter1;
}
cout << "偶数deque:\n";
for (int i : deven)
cout << i << ",";
cout << "\n奇数deque:\n";
for (int i : duneven)
cout << i << ",";
cout << endl;
return 0;
}
9.21相同
9.22
死循环,循环条件里加个++iter
9.23
都是第一个元素的值
9.24
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<string> vec{ "string" };
cout << vec.at(0) << endl
<< vec[0] << endl
<< vec.front() << endl
<< *vec.begin() << endl;
}
9.25
什么都不发生;删除elem1后的所有元素;什么都不发生
9.26
#include<iostream>
#include<vector>
#include<list>
using namespace std;
int main()
{
int a[] = { 0,1,2,3,5,8,13,21,55,89 };
vector<int> vec(begin(a), end(a));
list<int> li(begin(a), end(a));
vector<int>::iterator it = vec.begin();
while (it != vec.end())
if (!(*it % 2))
it = vec.erase(it);
else
++it;
list<int>::iterator it1 = li.begin();
while (it1 != li.end())
if (*it1 % 2)
it1 = li.erase(it1);
else
++it1;
cout << "vector中的元素:\n";
for (int val : vec)
cout << val << ",";
cout << "\nlist中的元素:\n";
for (int val1 : li)
cout << val1 << ",";
cout << endl;
return 0;
}
9.27
#include<iostream>
#include<forward_list>
using namespace std;
int main(int argc,char*argv[])
{
forward_list<int> fli{ 0,1,2,3,4,5,6 };
auto prev = fli.before_begin();
auto curr = fli.begin();
while (curr != fli.end())
if (*curr % 2)
curr = fli.erase_after(prev);
else
{
prev = curr;
++curr;
}
for (int val : fli)
cout << val << ",";
return 0;
}
9.28
#include<iostream>
#include<forward_list>
#include<string>
using namespace std;
void insert_to(forward_list<string> &fli,const string find,const string sin)
{
auto curr = fli.begin();
auto before_end = curr;
while (curr != fli.end())
{
if (*curr== find)
{
fli.insert_after(curr, sin);
return;
}
++curr;
if (curr != fli.end())
before_end = curr;
}
fli.insert_after(before_end, sin);
}
int main(int argc,char*argv[])
{
forward_list<string> fli{ "haha","hehe","hoho","C++" };
string s1 = "w", s2 = "insert me";
insert_to(fli, s1,s2);
for (string s : fli)
cout << s << ",";
return 0;
}
9.29
vec.resize(100)会将vec大小调整为100,后添加的75个元素初始化为0;
接下来调用vec.size(10)会删除后面的90个元素;
9.30
不能是array
9.31
不支持iter+=2的随机访问运算,改为++iter;++iter;或者advance(iter,2)
9.32
不合法,未定义操作,一条表达式里的子表达式更改了某项内容的值,而还有一条子表达式需要使用该值;
9.33
迭代器丢失并失效
9.34
无限 循环
9.35
capacity是指不重新分配空间的情况下可以保存多少元素,size是指已经保存了多少元素
9.36
不可能
9.37
list在内存的存储不是连续的,array的大小是固定的
9.38
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(int argc, char *argv[])
{
vector<string> vec;
string word;
while (cin >> word)
{
vec.push_back(word);
cout <<"size="<< vec.capacity() << endl;
}
return 0;
}
9.40
存了256个词之后,则256 + 256/2 = 384 < 1024 则capacity为1024
存了512个词之后,512 + 512/2 = 768 < 1024,则capacity为1024
存了1000个词之后,1000+1000/2 = 1500 > 1024 capacity大于1500,具体依赖编译器环境
存了1048个词之后,1048+1048/2 = 1572 > 1024,capacity 大于1572,具体依赖编译器环境
9.41
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(int argc, char *argv[])
{
vector<char> vec{ 'C','+','+' };
string s(vec.begin(), vec.end());
cout << s;
return 0;
}
9.42
先reserve(100),预先申请100个空间
9.43
#include<iostream>
#include<vector>
#include<string>
using namespace std;
void hu_replace(string&s, const string &oldVal, const string &newVal)
{
for (auto beg = s.begin(); beg != s.end(); ++beg)
{
if (*beg != oldVal[0])
continue;
if (beg + oldVal.size() > s.end())
break;
if (string(beg, beg + oldVal.size()) == oldVal)
{
size_t pos= beg - s.begin();
s.erase(pos, oldVal.size());
s.insert(pos, newVal);
beg = s.begin() + pos + newVal.size() - 1;
}
}
}
int main(int argc, char *argv[])
{
string str = "1111";
hu_replace(str, "11", "21");
cout << str;
return 0;
}
9.44
#include<iostream>
#include<vector>
#include<string>
using namespace std;
void hu_replace(string&s, const string &oldVal, const string &newVal)
{
for (auto beg = s.begin(); beg != s.end(); ++beg)
{
if (*beg != oldVal[0])
continue;
if (beg + oldVal.size() > s.end())
break;
if (string(beg, beg + oldVal.size()) == oldVal)
{
size_t pos= beg - s.begin();
s.replace(pos, oldVal.size(), newVal);
beg = s.begin() + pos + newVal.size() - 1;
}
}
}
int main(int argc, char *argv[])
{
string str = "1111";
hu_replace(str, "11", "21");
cout << str;
return 0;
}
9.45
#include<string>
using namespace std;
string& hu_replace( string &s, const string &before, const string &after)
{
s.insert(s.begin(), before.begin(), before.end());
s.append(after.begin(), after.end());
return s;
}
int main()
{
string s = "hansan";
hu_replace(s, "Mr.", "Jr.");
cout << s;
}
9.46
#include<iostream>
#include<vector>
#include<string>
using namespace std;
string& hu_replace( string &s, const string &before, const string &after)
{
s.insert(0, before);
s.insert(s.size(),after);
return s;
}
int main()
{
string s = "hansan";
hu_replace(s, "Mr.", "Jr.");
cout << s;
}
9.47
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char*argv[])
{
string s("ab2c3d7R4E6");
string number("0123456789");
string::size_type pos = 0;
while ((pos = s.find_first_of(number, pos))
!= string::npos)
{
cout << "find number at index:" << pos
<< " element is " << s[pos] << endl;
++pos;
}
pos = 0;
while ((pos = s.find_first_not_of(number, pos))
!= string::npos)
{
cout << "find letter at index:" << pos
<< " element is " << s[pos] << endl;
++pos;
}
return 0;
}
9.48
string::npos;
9.50
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(int argc, char*argv[])
{
vector<string> vec{ "1","2","3","4","5" };
int sum = 0;
for (string s : vec)
sum += stoi(s);
cout << sum;
return 0;
}
9.51
#include<iostream>
#include<string>
using namespace std;
class Date
{
private:
unsigned year;
unsigned month;
unsigned day;
public:
Date(string&);
friend ostream& operator<<(ostream&os, const Date&);
};
Date::Date(string&s)
{
string separator(" /,");
string::size_type pos = s.find_first_of(separator);
string::size_type pos1 = s.find_last_of(separator);
if (pos != string::npos&&pos1 != string::npos)
{
string temp = s.substr(0, pos);
if ("January" == temp || "Jan" == temp)
temp = "1";
else if ("Fenruary" == temp || "Feb" == temp)
temp = "2";
else if ("March" == temp || "Mar" == temp)
temp = "3";
else if ("April" == temp || "Apr" == temp)
temp = "4";
else if ("May" == temp)
temp = "5";
else if ("June" == temp || "Jun" == temp)
temp = "6";
else if ("July" == temp || "Jul" == temp)
temp = "7";
else if ("August" == temp || "Aug" == temp)
temp = "8";
else if ("September" == temp || "Sep" == temp)
temp = "9";
else if ("October" == temp || "Oct" == temp)
temp = "10";
else if ("November" == temp || "Nov" == temp)
temp = "11";
else if ("December" == temp || "Dec" == temp)
temp = "12";
month = stoul(temp);
}
year = stoul(s.substr(pos1+1));
day = stoul(s.substr(pos + 1, pos1 - pos - 1));
}
ostream&operator<<(ostream&os, const Date&d)
{
os << "year:" << d.year << endl
<< "month:" << d.month << endl
<< "day:" << d.day << endl;
return os;
}
int main()
{
string s;
getline(cin,s);
Date da(s);
cout << da;
return 0;
}