Этот генератор случайных чисел должен быть функтором с единственным аргументом, возвращающим единственное значение, и оба они должны преобразовываться в iterator_traits
struct RanNumGenFtor {
size_t operator()(size_t n) const {
return(rand() % n);
}
} rnd;
random_shuffle(v.begin(), vend(), rnd);
Приложения random_shuffle
string
, vector
и deque
), массивами или собственными контейнерами, удовлетворяющими этому требованию. Перемешать случайным образом ассоциативный контейнер невозможно, так как его содержимое всегда хранится в упорядоченном виде. На самом деле для ассоциативных контейнеров не всегда можно использовать алгоритм, изменяющий его диапазон (и который часто называется видоизменяющим (7.4. Сравнение диапазонов
Имеется два диапазона и требуется сравнить их на равенство или определить, какой из них меньше, чем другой, основываясь на каком-либо порядке сортировки элементов.
В зависимости от типа выполняемого сравнения используйте один из стандартных алгоритмов — equal
lexicographical_compare
или mismatch
, определенных в
. Пример 7.4 показывает некоторые из них в действии.#include
#include
#include
#include
#include "utils.h"
using namespace std;
using namespace utils;
int main() {
vector
vec1.push_back("Charles");
vec1.push_back("in");
vec1.push_back("Charge");
vec2.push_back("Charles");
vec2.push_back("in");
vec2.push_back("charge"); // Обратите внимание на строчную "с"
if (equal(vec1.begin(), vec1.end(), vec2.begin())) {
cout << "Два диапазона равны!" << endl;
} else {
cout << "Два диапазона HE равны!" << endl;
}
string s1 = "abcde";
string s2 = "abcdf";
string s3 = "abc";
cout << boolalpha // Отображает логические значения как "true" или "false"
<< lexicographical_compare(s1.begin(), s1.end(),
s1.begin(), s1.end()) << endl;
cout << lexicographical_compare(s1.begin(), s1.end(),
s2.begin(), s2.end()) << endl;
cout << lexicographical_compare(s2.begin(), s2.end(),
s1.begin(), s1.end()) << endl;
cout << lexicographical_compare(s1.begin(), s1.end(),
s3.begin(), s3.end()) << endl;
cout << lexicographical_compare(s3.begin(), s3.end(),
s1.begin(), s1.end()) << endl;
pair
mismatch(s1.begin(), s1.end(), s2.begin());
cout << "first mismatch = " << *(iters.first) << endl;
cout << "second mismatch = " << *(iters.second) << endl;
}
Вывод примера 7.4 выглядит так.
Два диапазона НЕ равны!
false
true
false
false
true
first mismatch = e
second mismatch = f
Для сравнения двух последовательностей на равенство используйте equal
equal
.bool equal(In1 first1, In1 last1, In2 first2);
bool equal(In1 first1, In1 last1, In2 first2, BinPred pred);
equal
operator==
сравнивает каждый элемент между first1
и last1
с элементами, начиная с first2
. Если указать pred
, то equal
для проверки будет использовать его. Перед вызовом equal
убедитесь, что каждая последовательность имеет одинаковую длину. Он предполагает, что второй диапазон не меньше первого, и если это не так, то его поведение не определено.