std::vector 创建 遍历 实现约瑟夫

(1)

#include 
#include  
using namespace std;
int main() {
     
	vector <int> v(100);
	vector<int>::iterator i;
	for (int i = 0; i < v.size(); i++) v[i] = i+1;
	for (int i = 0; i < v.size(); i++)//下标访问
		cout << v[i] << " ";
	cout << endl;
	for (i = v.begin(); i != v.end(); ++i)//正向迭代器
		cout << *i << " ";
	cout<< endl;
	for (vector<int>::reverse_iterator i= v.rbegin(); i != v.rend(); ++i)
		cout << *i << " ";//反向迭代器
	return 0;
	cout << endl;
}	

要点及补充

一. 迭代器
迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

迭代器按照定义方式分成以下四种。

  1. 正向迭代器,定义方法如下:
    容器类名::iterator 迭代器名;

  2. 常量正向迭代器,定义方法如下:
    容器类名::const_iterator 迭代器名;

  3. 反向迭代器,定义方法如下:
    容器类名::reverse_iterator 迭代器名;

  4. 常量反向迭代器,定义方法如下:
    容器类名::const_reverse_iterator 迭代器名;

二. 迭代器都可以进行 ++操作
反向迭代器和正向迭代器的区别在于:
对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素;
而对反向迭代器进行++操作时,迭代器会指向容器中的前一个元素。

三.常用的迭代器按功能强弱分为输入、输出、正向、双向、随机访问五种。

  1. 正向迭代器。假设 p 是一个正向迭代器,则 p 支持以下操作:++p,p++,*p。此外,两个正向迭代器可以互相赋值,还可以用==和!=运算符进行比较。

  2. 双向迭代器。双向迭代器具有正向迭代器的全部功能。除此之外,若 p 是一个双向迭代器,则–p和p–都是有定义的。–p使得 p 朝和++p相反的方向移动。

  3. 随机访问迭代器。随机访问迭代器具有双向迭代器的全部功能。若 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:
    p+=i:使得 p 往后移动 i 个元素。
    p-=i:使得 p 往前移动 i 个元素。
    p+i:返回 p 后面第 i 个元素的迭代器。
    p-i:返回 p 前面第 i 个元素的迭代器。
    p[i]:返回 p 后面第 i 个元素的引用。

此外,两个随机访问迭代器 p1、p2 还可以用 <、>、<=、>= 运算符进行比较。p1

对于两个随机访问迭代器 p1、p2,表达式p2-p1也是有定义的,其返回值是 p2 所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数减一)。

四.不同容器的迭代器功能

容器 迭代器功能
vector 随机访问
deque 随机访问
set / multiset 双向
map / multimap 双向
stack 双向
queue 不支持迭代器
priority_queue 不支持迭代器

五.vector
在 STL 中定义的数据类型通常称为容器。之所以称为容器,是因为它们存储和组织数据。STL 中有两种类型的容器:顺序容器和关联容器:
顺序容器以序列方式组织数据,类似于数组;
关联容器使用关键字组织数据,它允许对存储在容器中的元素进行快速随机访问;

vector 数据类型是一个序列容器,它很像一个一维数组,其表现和数组相似的地方如下:
1)矢量包含一系列值或元素。
2)矢量将其元素存储在连续的内存位置中。
3)可以使用数组下标运算符[]访问矢量中的各个元素。

但是,矢量相对于数组还有几个优点,比如说:
1)不必声明矢量将具有的元素的数量。
2)如果向已满的矢量添加值,则矢量将自动增加其大小以适应新值。
3)矢量可以报告它们包含的元素的数量。

(2)

用vector实现约瑟夫环问题

#include
#include
using namespace std;

int main(){
     
	vector<int> v;
	int n, m;
	cout<<"请输入总人数n和报数退出数m:"<<endl;
	cin >> n >> m;
	for (int i = 0; i <n ; i++) {
     
		v.push_back(i+1);
	}
	vector<int>::iterator it = v.begin();
	while (v.size()) {
     
		for (int i = 1; i < m; i++) {
     
			it++;
			if (it == v.end()) {
     
				it = v.begin();
			}
		}
		cout << *it << " ";
		it = v.erase(it);//!!
		if (it == v.end()) {
     
			it = v.begin();
		}	
	}
	return 0;
}
#include
#include
using namespace std;
int main()
{
     
	vector<int> v;             
	int n, m, x = 0;
	cout << "请输入总人数n和报数退出数m:" << endl;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
     
		v.push_back(i + 1); 
	}
	int i, j, k = 0;
	for (i = 0; i < n; i++)
	{
     
		j = 1;
		while (j < m)
		{
     
			while (v[k] == 0) k = (k + 1) % n;
			    j++;
			    k = (k + 1) % n;
		}
		while (v[k] == 0)  k = (k + 1) % n;
		    cout << v[k] << " ";
		    v[k] = 0;
	}
	return 0;
}

要点及补充

1.利用迭代器删除元素

1)对于关联容器(如map,set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前的iterator即可。
2)对于序列式容器(如vector,deque,list等),删除当前的iterator会使后面所有元素的iterator都失效。这是因为vector,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。
erase方法可以返回下一个有效的iterator。

详见:关于迭代器删除元素
删除处理细节

2.vector成员函数汇总

成员函数 描 述
at(position) 返回 vector 中位于 position 位置的元素的值。示例:x = vect. at (5) ; //将 vect [5] 的值赋给 x
capacity() 返回在不重新分配额外内存的情况下,可能存储在矢量中的最大元素数量(它和由 size 成员函数返回的值并不是一回事)。示例:x = vect. capacity () ; //将 vect 的容量赋值给 x
clear() 清除矢量的所有元素。示例:vect .clear () ; //从 vect 中移除所有元素
empty() 如果 vector 是空的,则返回 true。否则,它返回 false。示例:if (vect. empty ()) ; //如果该矢量是空的cout << “The vector is empty.”;
pop_back() 从矢量中删除最后一个元素。示例:vect.pop_back () ; //移除 vect 的最后一个元素,大小减去1
push_back(value) 在矢量的最后一个元素中存储一个值。如果矢量已满或为空,则会创建一个 新元素。示例:vect.push_back (7) ; //在 vect 的最后一个元素中存储 7
reverse() 反转矢量中元素的顺序(最后一个元素变成第一个元素,第一个元素成为最后一个元素)。示例:vect. reverse () ; //反转 vect 中元素的顺序
reverse() 反转矢量中元素的顺序(最后一个元素变成第一个元素,第一个元素成为最后一个元素)。示例:vect. reverse () ; //反转 vect 中元素的顺序
resize(n) resize(n, value) 调整矢量的大小以使其具有 n 个元素,其中 n 大于矢量的当前大小。如果包含可选的参数 value,则每个新元素都将使用该 value 值进行初始化。 vect 当前已有 4 个元素情况下的示例:vect. resize (6, 99) ; //将两个元素添加到矢量的末尾,每个元素初始化为 99
size() 返回矢量中元素的数量。示例:numElements = vect.size();
swap(vector2) 将矢量的内容与 vector2 的内容交换。示例:vect1.swap (vect2) ; //交换 vect1 和 vect2 的内容

你可能感兴趣的:(c++)