我利用了algorithm裏的random_shuffle函數,這個函數是隨機排序的。我的思路是用另壹個vector取出不要固定的元素做隨機排序,然後把固定元素還原得到重排後的vector:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int i = 0;
template<typename T>
void print(vector<T> numbers)
{
for (T number : numbers)
cout << number << ","; // 為了方便沒後去掉最後的逗號
cout << endl;
}
template<typename T>
void shuffleEO(vector<T> &numbers, int index) // shuffle excluding one
{
int count = numbers.size(); // vector.size(),返回vector元素個數
if (index >= count) return;?
vector<T> temp;
for (i = 0; i < index; i++)?
temp.push_back(numbers.at(i)); // vector.push_back(),添加壹個元素至vector的末尾
for (i = index+1; i < count; i++)
temp.push_back(numbers.at(i));? // 這裏的兩個for把原數組中除了index外的元素復制到了temp中,並且保持先後順序不變
random_shuffle(temp.begin(), temp.end()); // random_shuffle()是algorithm裏面的壹個標準庫函數,有兩個重載的版本,這裏用的是兩個參數的,還有壹個三個參數的。兩個參數的版本接收兩個叠代器指針作為參數,前者指向序列首,後者指向序列尾,random_shuffle會對在這兩個指針之間的元素隨機重排。三個參數的版本額外接收壹個指定重排規則的參數,不怎麽常用。這裏的vector.begin()指向vector第壹個元素,vector.end()指向最後壹個元素的後壹個位置(註意不是最後壹個元素)
vector<T> temp2;
for (i = 0; i < index; i++)
temp2.push_back(temp.at(i)); // 先把index前的元素加入temp2中
temp2.push_back(numbers.at(index)); // 把index加入temp2中
for (i = index; i < count-1; i++)
temp2.push_back(temp.at(i)); // 最後把index後的元素加入temp2中
numbers = temp2; // 這樣壹來index位置不變,而其它元素已經隨機排序,temp2就是最終的結果,因為按引用傳遞numbers,所以這裏把temp2賦值給numbers
}
int main(void)
{
vector<int> test;
for (i = 0; i < 10; i++) test.push_back(i);
print(test);
cout << "Now shuffle index 0:" << endl;
for (int j = 0; j < 15; j++)
{
shuffleEO(test, 0);
print(test);
}
cout << "Now shuffle index 4:" << endl;
test.clear(); // vector.clear()清空vector中的元素,相當於變為壹個空的vector
for (i = 0; i < 10; i++) test.push_back(i);
print(test);
for (int j = 0; j < 15; j++)
{
shuffleEO(test, 4);
print(test);
}
return 0;
}
輸出結果: