歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++ 一條代碼打印vector內容以及random_shuffle函數

C++ 一條代碼打印vector內容以及random_shuffle函數

日期:2017/3/1 10:25:07   编辑:Linux編程
  1. #include <iostream>
  2. #include <vector>
  3. #include <iterator>
  4. #include <algorithm>
  5. using namespace std;
  6. int main (int argc, char *argv[])
  7. {
  8. int n = 10;
  9. vector<int> v;
  10. //append integers 0 to n-1 to v
  11. for (int i = 0; i < n; ++i) {
  12. v.push_back(i);
  13. }
  14. //random shuffle the values of v
  15. random_shuffle (v.begin(), v.end());
  16. //print all values of v to screen
  17. copy (v.begin(), v.end(), ostream_iterator<int> (cout, "\n"));
  18. return 0;
  19. }

運行結果:

8
1
9
2
0
5
7
3
4
6
Press any key to continue . . .

本實例簡單演示了vector的使用,實際上該演示代碼同時包含了迭代器(iterator)技術,如v.begin()和v.end(),

他們分別指示vector向量的初始化和末尾指針,同時該代碼還采用了STL技術中的算法技術,通過STL算法函數

random_shuffle吧容器類的元素順序搗亂,並通過算法函數copy實現數據的輸出。

有關以上程序的運行過程如下圖所示,假設總共有100個元素,以上代碼首先定義了一個空的vector對象,然後

賦值如第二步所示,第三步顯示了賦值完畢後向量的存儲實例,通過random_shuffle函數把容器類的元素順序搗亂

後向量中存儲的元素如第四步所示:

關於random_shuffle函數詳解如下:

1.其函數原型如下:

  1. template <class RandomAccessIterator>
  2. void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last );
  3. template <class RandomAccessIterator, class RandomNumberGenerator>
  4. void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
  5. RandomNumberGenerator& rand );
該函數的功能是重新隨機的排列first到last的間的所有元素。

Rearranges the elements in the range [first,last) randomly.

The function swaps the value of each element with that of some other randomly chosen element. When provided, the function rand chooses which element.

The behavior of this function template is equivalent to:

  1. template <class RandomAccessIterator, class RandomNumberGenerator>
  2. void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
  3. RandomNumberGenerator& rand )
  4. {
  5. iterator_traits<RandomAccessIterator>::difference_type i, n;
  6. n = (last-first);
  7. for (i=n-1; i>0; --i) swap (first[i],first[rand(i+1)]);
  8. }

Parameters

first, last
Forward iterators to the initial and final positions of the sequence to be shuffled. The range used is [first,last), which contains all the elements between first andlast, including the element pointed by first but not the element pointed by last.
rand
Pointer to unary function taking one argument and returning a value, both of the appropriate difference type (generally ptrdiff_t). The function shall return a value between zero and its argument (lower than this).

Return value

none

Example

  1. // random_shuffle example
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <functional>
  5. #include <vector>
  6. #include <ctime>
  7. #include <cstdlib>
  8. using namespace std;
  9. // random generator function:
  10. ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
  11. // pointer object to it:
  12. ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;
  13. int main () {
  14. srand ( unsigned ( time (NULL) ) );
  15. vector<int> myvector;
  16. vector<int>::iterator it;
  17. // set some values:
  18. for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
  19. // using built-in random generator:
  20. random_shuffle ( myvector.begin(), myvector.end() );
  21. // using myrandom:
  22. random_shuffle ( myvector.begin(), myvector.end(), p_myrandom);
  23. // print out content:
  24. cout << "myvector contains:";
  25. for (it=myvector.begin(); it!=myvector.end(); ++it)
  26. cout << " " << *it;
  27. cout << endl;
  28. return 0;
  29. }
A possible output:

myvector contains: 3 4 1 6 8 9 2 7 5

others:

ptrdiff_t

Result of pointer subtraction

This is the type returned by the subtraction operation between two pointers. This is a signed integral type, and as such can be casted to compatible fundamental data types.

A subtraction of two pointers is only granted to have a valid defined value for pointers to elements of the same array (or for the element just past the last in the array).

For other values, the behavior depends on the system characteristics and compiler implementation.
Copyright © Linux教程網 All Rights Reserved