1. 程式人生 > 其它 >c++ vector 排序_C++隨機排序容器中的元素

c++ vector 排序_C++隨機排序容器中的元素

技術標籤:c++ vector 排序

作者:apocelipes

連結:https://www.cnblogs.com/apocelipes/p/10351335.html

在各種程式語言中都提供了將容器元素隨機排序的shuffle方法,c++也不例外。

不過c++將shuffle放在了中而不是像其他語言一樣在random裡,同時c++17刪除了原先的random_shuffle新的程式應該使用c++11新增進去的std::shuffle。其中一個好處是新的函式在可以自定義隨機數生成方法的同時保證了更好的安全性。

先來看下新函式的原型:

templateclassRandomIt,classURBG>
voidshuffle(RandomItfirst,RandomItlast,URBG&&g);

其中first和last指定需要隨機排序的範圍,g是一個“UniformRandomBitGenerator”,就是一個可以產生規定範圍內的隨機數的可呼叫物件。

所以g可以是std::random_device或者像std::default_random_engine這樣的隨機數引擎,也可以是std::mt19937這樣的標準庫提供的隨機數生成器的物件,它們都在中。

shuffle呼叫後目標容器內的元素排列順序會被隨機打亂,我們看個例子。

首先是兩個幫助函式,避免做一些重複勞動:

//幫助函式,列印vector的內容
template
std::ostream&operator<conststd::vector&v)
{
os<"{";for(constauto&i:v){
os<",";
}
os<"}";returnos;
}//幫助函式,生成一個符合UniformRandomBitGenerator要求的隨機數生成器;//std::random_device雖然符合要求但是隻適合於生成seed及安全要求較高的場合,因為速度可能很慢。//所以我們選擇std::mt19937演算法,你可以自己選擇其他合適的演算法
autoget_URBG()
{
std::random_devicerd;//使用random_device生成seed
std::mt19937g(rd());returng;
}

然後我們分別打亂一個std::vector和std::vector<:string>容器內元素的排列順序:

//隨機排序容器內元素,列印隨機排序前和隨機排序後的容器內容
template<typenameT>
voidshuffle_container(std::vector&container){
std::cout<"beforeshuffle:"<std::endl;
std::shuffle(container.begin(),container.end(),get_URBG());
std::cout<"aftershuffle:"<std::endl;
}

intmain(){
std::vector<int>ivec{1,2,3,4,5};
shuffle_container(ivec);

//分割線
std::cout<std::string(40,'-')<std::endl;

std::vector<std::string>svec{"a","b","c","d","e","f","g"};
shuffle_container(svec);
}

我們編譯寫好的程式,然後執行:

a8e5757fd74110f7c7f70835e1e34692.png

可以看到元素都已經被隨機排序了。


●編號501,輸入編號直達本文

●輸入m獲取文章目錄

C語言與C++程式設計

00f876c91955b17925cf0e96d4ec994d.png

分享C/C++技術文章