下面的练习别忘记都加上下面这一语句
#include
(a)读取固定数量的单词,将它们按字典序插入到容器中。我们将在下一章中看到,关联容器更适合这个问题:
list,需要在中间插入数据,list最好;
(b) 读取未知数量的单词,总是将单词插入到末尾。删除操作在头部进行。
deque,需要在头部和尾部插入或删除元素,选deque;
©从一个文件读取未知数量的整数。将这些数排序,然后将它们打印到标准输出。
vector,没有特别的需求选vector。
#include
#include
using namespace std;
int main()
{
list<deque<int>> a;
}
forward_list迭代器不支持递减运算符(–)
iter+n,iter-n,iter1+=n,iter1-=n,iter1-iter2,>,>=,<,<=这些运算只能应用于string、vector、deque和array迭代器
一个迭代器范围一般为左闭合区间【begin,end)
#include
using namespace std;
int main()
{
vector<int> a = { 1,2,3,4 };
int b = 3;
for (auto i = a.begin(); i != a.end(); ++i) {
if (*i == b) {
cout << true << endl;
}
}
}
#include
using namespace std;
int main()
{
vector<int> a = { 1,2,3,4 };
int b = 0, digit = 0;
for (auto i = a.begin(); i != a.end(); ++i) {
if (*i == b) {
cout << "找到的数是:" << b << endl;
digit = 1;
}
if (i == (a.end() - 1) && digit == 0) {
cout << "未找到给定值" << endl;
}
}
}
#include
#include
using namespace std;
int main()
{
list<int> lst1;
list<int>::iterator iter1 = lst1.begin(),iter2 = lst1.end();
while (iter1 < iter2) /* ... */
}
修改后
#include
#include
using namespace std;
int main()
{
list<int> lst1;
list<int>::iterator iter1 = lst1.begin(),iter2 = lst1.end();
while (iter1 != iter2) /* ... */
}
vector<int>::size_type
list<string>::const_iterator //read
list<string>::iterator //write
当auto与begin或end结合使用时,获得的迭代器类型依赖于容器类型,与我们想要如何使用迭代器毫不相干。
但以c开头的版本还是可以获得const_iterator的,而不管容器的类型是什么。
vector<int> v1;
const vector<int> v2;
auto it1 = v1.begin(), it2 = v2.begin();
auto it3 = v1.cbegin(), it4 = v2.cbegin();
it1类型是vector::iterator
it2类型是vector::const_iterator
it3类型是vector::const_iterator
it4类型是vector::const_iterator
vector
默认构造函数,a为空a;
vector
a中为1,2,3a={0,1,2};
vector
a中10个0a(10);
vector
a中10个1a(10,1);
vector
a中为1,2,3a{0,1,2};
vector
a中为b的int化的元素a(b.begin(),b.end());
vector
将b赋给aa(b);
1、当将一个容器初始化为另一个容器的拷贝时,两个容器的容器类型的元素类型都必须相同
2、接受两个迭代器创建拷贝的构造函数用这两个迭代器表示我们想要拷贝的一个元素范围,与以往一样,两个迭代器分别标记想要拷贝的第一个元素和尾巴元素之后的位置,新容器中的每个元素都用范围中对应元素的值进行初始化。
#include
#include
using namespace std;
int main()
{
list<int> a = { 1,2,3 };
vector<int> b(a.begin(), a.end());
for (auto i : b) {
cout << i << endl;
}
vector<double> c(b.begin(), b.end());
for (auto i : c) {
cout << i << endl;
}
}
#include
#include
using namespace std;
int main()
{
list<const char*> a(10, "a");
vector<string> b;
b.assign(a.begin(),a.end());
for (auto i : b) {
cout << i << endl;
}
}
#include
using namespace std;
int main()
{
vector<int> a = { 1,2,3 };
vector<int> b = { 1,2,3,4 };
vector<int> c = { 1,2,5 };
vector<int> d = { 2,1,3 };
cout << (a < b ? 1 : 0) << endl;
cout << (a < c ? 1 : 0) << endl;
cout << (a < d ? 1 : 0) << endl;
}
#include
#include
using namespace std;
int main()
{
vector<int> a = { 1,2,3 };
vector<int> b = { 1,2,3,4 };
vector<int> c = { 1,2,5 };
vector<int> d = { 2,1,3 };
cout << (a < b ? 1 : 0) << endl;
cout << (a < c ? 1 : 0) << endl;
cout << (a < d ? 1 : 0) << endl;
list<int> e = { 1,2,3 };
vector<int> f(e.begin(), e.end());
cout << (a == f ? 1 : 0) << endl;
}
if(c1<c2)
c1和c2不能是无序容器,且容器类型要相同,最后,元素类型要支持运算符。
#include
#include
using namespace std;
int main()
{
string a;
deque<string> b;
while (cin >> a) {
if (a == "no")
break;
b.push_back(a);
}
for (auto i : b) {
cout << i << endl;
}
}
#include
#include
using namespace std;
int main()
{
string a;
list<string> b;
while (cin >> a) {
if (a == "no")
break;
b.push_back(a);
}
for (auto i : b) {
cout << i << endl;
}
}
#include
#include
using namespace std;
int main()
{
int a;
list<int> input;
deque<int> output1, output2;
while (cin >> a) {
input.push_back(a);
}
for (auto i : input) {
if (i % 2 == 0) {
output1.push_back(i);
}
else {
output2.push_back(i);
}
}
cout << "偶数是:";
for (auto i : output1) {
cout << i << " ";
}
cout << endl;
cout << "奇数是:";
for (auto i : output2) {
cout << i << " ";
}
cout << endl;
}
一样的操作,实现的是在vector的一个特定位置反复插入元素。
#include
using namespace std;
int main()
{
vector<int> iv(10, 0);
int some_val = 1;
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);
}
循环不会停止,一直在头部插入元素;迭代器在插入操作后会变化。
修改后
#include
using namespace std;
int main()
{
vector<int> iv(10, 0);
int some_val = 1;
vector<int>::iterator iter = iv.begin(),
mid = iv.begin() + iv.size() / 2;
while (iter != mid)
{
if (*iter == some_val)
{
iter = iv.insert(iter, 2 * some_val);
++iter;
}
++iter;
}
}
都是c中唯一元素的拷贝。
#include
using namespace std;
int main()
{
vector<int> a;
cout << a.at(0) << endl;
cout << a.front() << endl;
cout << a.back() << endl;
}
如果elem1与elem2相等,则一个元素都不会删除;
如果elem2是尾后迭代器,则会从elem1元素删除到最后一个元素;
如果elem1与elem2都是尾后迭代器,则一个元素都不会删除。
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
#include
#include
using namespace std;
int main()
{
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
vector<int> a;
list<int> b;
for (auto i : ia) {
a.push_back(i);
b.push_back(i);
}
for (auto i = a.begin(); i != a.end(); i) {
if (*i % 2 == 0) {
i = a.erase(i);
}
else
i++;
}
for (auto i = b.begin(); i != b.end(); i) {
if (*i % 2 != 0) {
i = b.erase(i);
}
else
i++;
}
for (auto i : a)
cout << i << " ";
cout << endl;
for (auto i : b)
cout << i << " ";
cout << endl;
}