我有以下代码来随机化列表容器中的元素:
#include <vector>
#include <list>
#include <iterator>
#include <algorithm>
#include <iostream>
using namespace std;
template<class RandomAccesIterator>
void randomize(RandomAccesIterator iterBegin, RandomAccesIterator iterEnd)
{
while (iterBegin != iterEnd)
{
iter_swap(iterBegin, iterBegin + rand() % (iterEnd - iterBegin));
++iterBegin;
}
}
然后稍后在main()中:
int main()
{
//container used as to apply algorithm to.
list<int> List = {34,77,16,2,35,76,18,2};
//randomize example.
cout << "calling randomize on sorted vector: " << endl;
List.sort();
vector<int> temp(List.begin(), List.end());
cout << "before randomize: " << endl;
for (vector<int>::iterator it = temp.begin(); it != temp.end(); it++)
{
cout << *it << " ";
}
cout << endl;
randomize(temp.begin(),temp.end());
cout << "after randomize: " << endl;
for (vector<int>::iterator it = temp.begin(); it != temp.end(); it++)
{
cout << *it << " ";
}
cout << endl<<endl;
return 0;
}
我有几个问题:
我相信执行iterEnd-iterBegin(如模板功能所示)是有效的操作,因为iterEnd和iterBegin都是C ++风格的指针。减去这些指针可得出它们之间的距离。我说得对吗?
我在即时窗口中尝试了以下操作:
iterEnd
{-33686019}
[ptr]: 0x00ba4f78 {-33686019}
[Raw View]: {...}
这表示iterEnd是一个指针,其值为0x00ba4f78,它指向-33686019的垃圾值。我相信这里是正确的吗?
因此,对于随机访问迭代器,迭代器是一个指针。所有迭代器类型(输入/输出迭代器,正向迭代器,双向迭代器)是否都适用?如果这些迭代器不是C ++样式的指针,那是什么?
&iterEnd
0x006ff368 {-33686019}
[ptr]: 0x00ba4f78 {-33686019}
[Raw View]: 0x006ff368 {...}
&&iterEnd
expected an expression
为什么&iterEnd给我一个地址?它应该给我消息“期望表达式”,就像&& iterEnd一样。
对于随机访问迭代器(矢量迭代器),是C ++的迭代器样式指针?