Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O <algorithm> cabeçalho fornece as seguintes funções:
adjacent_find
Procura dois elementos adjacentes que são iguais ou satisfazem uma condição especificada.
template<class ForwardIterator>
ForwardIterator adjacent_find(
ForwardIterator first,
ForwardIterator last);
template<class ForwardIterator , class BinaryPredicate>
ForwardIterator adjacent_find(
ForwardIterator first,
ForwardIterator last,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator>
ForwardIterator adjacent_find(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class BinaryPredicate>
ForwardIterator adjacent_find(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
BinaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador avançado na posição do primeiro elemento no intervalo a ser pesquisado.
last
Um iterador avançado na posição um após o elemento final no intervalo a ser pesquisado.
pred
O predicado binário que dá a condição a ser satisfeita pelos valores dos elementos adjacentes no intervalo que está sendo pesquisado.
Valor de retorno
Um iterador de encaminhamento para o primeiro dos elementos adjacentes que são iguais entre si (na primeira versão) ou que satisfazem a condição dada pelo predicado binário (na segunda versão) se tal par de elementos for encontrado. Caso contrário, um iterador apontando para last é retornado.
Observações
O adjacent_find algoritmo é um algoritmo de sequência não mutante. O intervalo a ser pesquisado deve ser válido. Todos os ponteiros devem ser desreferenciados, e a última posição deve ser alcançável a partir da primeira por incremento. A complexidade temporal do algoritmo é linear no número de elementos contidos no intervalo.
O operator== usado para determinar a correspondência entre elementos deve impor uma relação de equivalência entre seus operandos.
Exemplo
// alg_adj_fnd.cpp
// compile with: /EHsc
#include <list>
#include <algorithm>
#include <iostream>
// Returns whether second element is twice the first
bool twice (int elem1, int elem2 )
{
return elem1 * 2 == elem2;
}
int main()
{
using namespace std;
list<int> L;
list<int>::iterator Iter;
list<int>::iterator result1, result2;
L.push_back( 50 );
L.push_back( 40 );
L.push_back( 10 );
L.push_back( 20 );
L.push_back( 20 );
cout << "L = ( " ;
for ( Iter = L.begin( ) ; Iter != L.end( ) ; Iter++ )
cout << *Iter << " ";
cout << ")" << endl;
result1 = adjacent_find( L.begin( ), L.end( ) );
if ( result1 == L.end( ) )
cout << "There are not two adjacent elements that are equal."
<< endl;
else
cout << "There are two adjacent elements that are equal.\n"
<< "They have a value of "
<< *( result1 ) << "." << endl;
result2 = adjacent_find( L.begin( ), L.end( ), twice );
if ( result2 == L.end( ) )
cout << "There are not two adjacent elements where the "
<< "second is twice the first." << endl;
else
{
cout << "There are two adjacent elements where "
<< "the second is twice the first.\n"
<< "They have values of " << *(result2++)
<< " & " << *result2 << "." << endl;
}
}
L = ( 50 40 10 20 20 )
There are two adjacent elements that are equal.
They have a value of 20.
There are two adjacent elements where the second is twice the first.
They have values of 10 & 20.
all_of
Retorna true quando uma condição está presente em cada elemento no intervalo determinado.
template<class InputIterator, class UnaryPredicate>
bool all_of(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template <class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
bool all_of(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que indica por onde começar para verificar uma condição. O iterador marca onde um intervalo de elementos começa.
last
Um iterador de entrada que indica o fim do intervalo de elementos para verificar se há uma condição.
pred
Uma condição para testar.
pred é um objeto de função de predicado unário definido pelo usuário que define a condição a ser satisfeita por um elemento que está sendo verificado. Um predicado unário pega um único argumento e retorna true ou false.
Valor de retorno
Retorna true se a condição for detetada em cada elemento no intervalo indicado ou se o intervalo estiver vazio e false caso contrário.
Observações
A função de modelo retorna true somente se, para cada N um no intervalo [0, last - first), o predicado pred(*(first + N)) for true.
Exemplo
// alg_all_of.cpp
// compile with: /EHsc
#include <list>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
list<int> li { 50, 40, 10, 20, 20 };
list<int>::iterator iter;
cout << "li = ( ";
for (iter = li.begin(); iter != li.end(); iter++)
cout << *iter << " ";
cout << ")" << endl;
// Check if all elements in li are even.
auto is_even = [](int elem){ return !(elem % 2); };
if (all_of(li.begin(), li.end(), is_even))
cout << "All the elements are even numbers.\n";
else
cout << "Not all the elements are even numbers.\n";
}
li = ( 50 40 10 20 20 )
All the elements are even numbers.
any_of
Retorna true quando uma condição está presente pelo menos uma vez no intervalo especificado de elementos.
template<class InputIterator, class UnaryPredicate>
bool any_of(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template <class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
bool any_of(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que indica por onde começar a verificar um intervalo de elementos para uma condição.
last
Um iterador de entrada que indica o fim do intervalo de elementos para verificar se há uma condição.
pred
Uma condição para testar. Este teste é fornecido por um objeto de função de predicado definido pelo usuário. O predicado define a condição a satisfazer pelo elemento a ensaiar. Um predicado unário pega um único argumento e retorna true ou false.
Valor de retorno
Retorna true se a condição for detetada pelo menos uma vez no intervalo indicado, false se a condição nunca for detetada.
Observações
A função de modelo retorna true somente se, para alguns N no intervalo
[0, last - first), o predicado pred(*(first + N)) é verdadeiro.
Exemplo
// alg_any_of.cpp
// compile with: /EHsc
#include <list>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
list<int> li { 51, 41, 11, 21, 20 };
cout << "li = ( ";
for (auto const& el : li)
cout << el << " ";
cout << ")" << endl;
// Check if there's an even element in li.
auto is_even = [](int const elem){ return !(elem % 2); };
if (any_of(li.begin(), li.end(), is_even))
cout << "There's an even element in li.\n";
else
cout << "There are no even elements in li.\n";
}
li = ( 51 41 11 21 20 )
There's an even element in li.
binary_search
Testa se há um elemento em um intervalo classificado que é igual a um valor especificado ou que é equivalente a ele em um sentido especificado por um predicado binário.
template<class ForwardIterator, class Type>
bool binary_search(
ForwardIterator first,
ForwardIterator last,
const Type& value);
template<class ForwardIterator, class Type, class BinaryPredicate>
bool binary_search(
ForwardIterator first,
ForwardIterator last,
const Type& value,
BinaryPredicate pred);
Parâmetros
first
Um iterador avançado que aborda a posição do primeiro elemento no intervalo a ser pesquisado.
last
Um iterador avançado abordando a posição um após o elemento final no intervalo a ser pesquisado.
value
O valor necessário para ser correspondido pelo valor do elemento ou que deve satisfazer a condição com o valor do elemento especificado pelo predicado binário.
pred
Objeto de função de predicado definido pelo usuário que define o sentido no qual um elemento é menor que outro. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
true se um elemento for encontrado no intervalo que é igual ou equivalente ao valor especificado; caso contrário, false.
Observações
O intervalo de origem classificado referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição deve ser alcançável a partir da primeira por incremento.
Cada intervalo ordenado deve ser organizado como uma pré-condição para a aplicação do binary_search algoritmo de acordo com a mesma ordenação que deve ser usada pelo algoritmo para classificar os intervalos combinados.
Os intervalos de origem não são modificados pelo binary_search.
Os tipos de valor dos iteradores de encaminhamento devem ser menores do que comparáveis para serem encomendados. Ou seja, dados dois elementos, você pode determinar que um é menor que o outro, ou que eles são equivalentes. (Aqui, equivalente significa que nenhum é menor que o outro.) Esta comparação resulta numa ordenação entre os elementos não equivalentes.
A complexidade do algoritmo é logarítmica para iteradores de acesso aleatório e linear de outra forma, com o número de passos proporcional a (last-first).
Exemplo
// alg_bin_srch.cpp
// compile with: /EHsc
#include <list>
#include <vector>
#include <algorithm>
#include <functional> // greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser( int elem1, int elem2 )
{
if (elem1 < 0)
elem1 = - elem1;
if (elem2 < 0)
elem2 = - elem2;
return elem1 < elem2;
}
int main()
{
using namespace std;
list<int> List1;
List1.push_back( 50 );
List1.push_back( 10 );
List1.push_back( 30 );
List1.push_back( 20 );
List1.push_back( 25 );
List1.push_back( 5 );
List1.sort();
cout << "List1 = ( " ;
for ( auto Iter : List1 )
cout << Iter << " ";
cout << ")" << endl;
// default binary search for 10
if ( binary_search(List1.begin(), List1.end(), 10) )
cout << "There is an element in list List1 with a value equal to 10."
<< endl;
else
cout << "There is no element in list List1 with a value equal to 10."
<< endl;
// a binary_search under the binary predicate greater
List1.sort(greater<int>());
if ( binary_search(List1.begin(), List1.end(), 10, greater<int>()) )
cout << "There is an element in list List1 with a value greater than 10 "
<< "under greater than." << endl;
else
cout << "No element in list List1 with a value greater than 10 "
<< "under greater than." << endl;
// a binary_search under the user-defined binary predicate mod_lesser
vector<int> v1;
for ( auto i = -2; i <= 4; ++i )
{
v1.push_back(i);
}
sort(v1.begin(), v1.end(), mod_lesser);
cout << "Ordered using mod_lesser, vector v1 = ( " ;
for ( auto Iter : v1 )
cout << Iter << " ";
cout << ")" << endl;
if ( binary_search(v1.begin(), v1.end(), -3, mod_lesser) )
cout << "There is an element with a value equivalent to -3 "
<< "under mod_lesser." << endl;
else
cout << "There is not an element with a value equivalent to -3 "
<< "under mod_lesser." << endl;
}
List1 = ( 5 10 20 25 30 50 )
There is an element in list List1 with a value equal to 10.
There is an element in list List1 with a value greater than 10 under greater than.
Ordered using mod_lesser, vector v1 = ( 0 -1 1 -2 2 3 4 )
There is an element with a value equivalent to -3 under mod_lesser.
clamp
Compara um valor a um limite superior e inferior e retorna uma referência ao valor se estiver entre os limites, ou uma referência ao limite superior ou inferior se o valor estiver acima ou abaixo deles, respectivamente.
template<class Type>
constexpr const Type& clamp(
const Type& value,
const Type& lower,
const Type& upper);
template<class Type, class Compare>
constexpr const Type& clamp(
const Type& value,
const Type& lower,
const Type& upper,
Compare pred);
Parâmetros
value
O valor a comparar com upper e lower.
lower
O limite inferior dos valores a serem apertados value .
upper
O limite superior dos valores a serem apertados value .
pred
Um predicado usado para comparar value com lower ou upper. Um predicado de comparação usa dois argumentos e retorna true se o primeiro for, em algum sentido, menor que o segundo, e caso contrário, false.
Valor de retorno
Devolve uma referência a lower if value < lower, ou uma referência a upper if upper < value. Caso contrário, ele retorna uma referência a value.
Observações
O comportamento é indefinido se upper for menor que lower.
copy
Atribui os valores dos elementos de um intervalo de origem a um intervalo de destino, iterando através da sequência de origem de elementos e atribuindo-lhes novas posições em uma direção avançada.
template<class InputIterator, class OutputIterator>
OutputIterator copy(
InputIterator first,
InputIterator last,
OutputIterator destBeg);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 copy(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que aborda a posição do primeiro elemento no intervalo de origem.
last
Um iterador de entrada que aborda a posição que é um passado do elemento final no intervalo de origem.
destBeg
Um iterador de saída que aborda a posição do primeiro elemento no intervalo de destino.
Valor de retorno
Um iterador de saída que aborda a posição que é um passado do elemento final no intervalo de destino, ou seja, os endereços result do iterador + ( - lastfirst).
Observações
O intervalo de origem deve ser válido e deve haver espaço suficiente no destino para armazenar todos os elementos que estão sendo copiados.
Como o algoritmo copia os elementos de origem em ordem começando com o primeiro elemento, o intervalo de destino pode se sobrepor ao intervalo de origem, desde que a last posição do intervalo de origem não esteja contida no intervalo de destino.
copy pode ser usado para deslocar elementos para a esquerda, mas não para a direita, a menos que não haja sobreposição entre os intervalos de origem e destino. Para deslocar para a direita qualquer número de posições, use o copy_backward algoritmo.
O copy algoritmo apenas modifica valores apontados pelos iteradores, atribuindo novos valores a elementos no intervalo de destino. Ele não pode ser usado para criar novos elementos e não pode inserir elementos em um contêiner vazio diretamente.
Exemplo
// alg_copy.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1, Iter2;
int i;
for ( i = 0 ; i <= 5 ; i++ )
v1.push_back( 10 * i );
int ii;
for ( ii = 0 ; ii <= 10 ; ii++ )
v2.push_back( 3 * ii );
cout << "v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// To copy the first 3 elements of v1 into the middle of v2
copy( v1.begin( ), v1.begin( ) + 3, v2.begin( ) + 4 );
cout << "v2 with v1 insert = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// To shift the elements inserted into v2 two positions
// to the left
copy( v2.begin( )+4, v2.begin( ) + 7, v2.begin( ) + 2 );
cout << "v2 with shifted insert = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
}
v1 = ( 0 10 20 30 40 50 )
v2 = ( 0 3 6 9 12 15 18 21 24 27 30 )
v2 with v1 insert = ( 0 3 6 9 0 10 20 21 24 27 30 )
v2 with shifted insert = ( 0 3 0 10 20 10 20 21 24 27 30 )
copy_backward
Atribui os valores dos elementos de um intervalo de origem a um intervalo de destino, iterando através da sequência de origem de elementos e atribuindo-lhes novas posições em uma direção inversa.
template<class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 copy_backward(
BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 destEnd);
Parâmetros
first
Um iterador bidirecional que aborda a posição do primeiro elemento no intervalo de origem.
last
Um iterador bidirecional que aborda a posição que é um passado do elemento final no intervalo de origem.
destEnd
Um iterador bidirecional que aborda a posição de um passado do elemento final no intervalo de destino.
Valor de retorno
Um iterador de saída que aborda a posição que é um passado do elemento final no intervalo de destino, ou seja, os endereços destEnd - (last - first)do iterador .
Observações
O intervalo de origem deve ser válido e deve haver espaço suficiente no destino para armazenar todos os elementos que estão sendo copiados.
O copy_backward algoritmo impõe requisitos mais rigorosos do que o copy algoritmo. Ambos os seus iteradores de entrada e saída devem ser bidirecionais.
Os copy_backward algoritmos e move_backward são os únicos algoritmos da biblioteca padrão C++ que designam o intervalo de saída com um iterador apontando para o final do intervalo de destino.
Como o algoritmo copia os elementos de origem em ordem começando com o último elemento, o intervalo de destino pode se sobrepor ao intervalo de origem, desde que a first posição do intervalo de origem não esteja contida no intervalo de destino.
copy_backward pode ser usado para deslocar elementos para a direita, mas não para a esquerda, a menos que não haja sobreposição entre os intervalos de origem e destino. Para deslocar para a esquerda qualquer número de posições, use o copy algoritmo.
O copy_backward algoritmo apenas modifica valores apontados pelos iteradores, atribuindo novos valores a elementos no intervalo de destino. Ele não pode ser usado para criar novos elementos e não pode inserir elementos em um contêiner vazio diretamente.
Exemplo
// alg_copy_bkwd.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1, Iter2;
int i;
for ( i = 0 ; i <= 5 ; ++i )
v1.push_back( 10 * i );
int ii;
for ( ii = 0 ; ii <= 10 ; ++ii )
v2.push_back( 3 * ii );
cout << "v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; ++Iter1 )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; ++Iter2 )
cout << *Iter2 << " ";
cout << ")" << endl;
// To copy_backward the first 3 elements of v1 into the middle of v2
copy_backward( v1.begin( ), v1.begin( ) + 3, v2.begin( ) + 7 );
cout << "v2 with v1 insert = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; ++Iter2 )
cout << *Iter2 << " ";
cout << ")" << endl;
// To shift the elements inserted into v2 two positions
// to the right
copy_backward( v2.begin( )+4, v2.begin( ) + 7, v2.begin( ) + 9 );
cout << "v2 with shifted insert = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; ++Iter2 )
cout << *Iter2 << " ";
cout << ")" << endl;
}
v1 = ( 0 10 20 30 40 50 )
v2 = ( 0 3 6 9 12 15 18 21 24 27 30 )
v2 with v1 insert = ( 0 3 6 9 0 10 20 21 24 27 30 )
v2 with shifted insert = ( 0 3 6 9 0 10 0 10 20 27 30 )
copy_if
Em um intervalo de elementos, copia os elementos que são true para a condição especificada.
template<class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if(
InputIterator first,
InputIterator last,
OutputIterator dest,
UnaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class UnaryPredicate>
ForwardIterator2 copy_if(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result,
UnaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que indica o início de um intervalo para verificar a condição.
last
Um iterador de entrada que indica o fim do intervalo.
dest
O iterador de saída que indica o destino dos elementos copiados.
pred
A condição contra a qual cada elemento do intervalo é testado. Essa condição é fornecida por um objeto de função de predicado definido pelo usuário. Um predicado unário pega um argumento e retorna true ou false.
Valor de retorno
Um iterador de saída que é igual a incrementado dest uma vez para cada elemento que cumpre a condição. Em outras palavras, o valor de retorno menos dest é igual ao número de elementos copiados.
Observações
A função de modelo avalia
if (pred(*first + N)) * dest++ = *(first + N))
uma vez para cada N um no intervalo [0, last - first), para valores estritamente crescentes de N começar com o menor valor. Se dest e first designar regiões de armazenamento, dest não deve estar no intervalo [ first, last ).
Exemplo
// alg_copy_if.cpp
// compile with: /EHsc
#include <list>
#include <algorithm>
#include <iostream>
void listlist(std::list<int> l)
{
std::cout << "( ";
for (auto const& el : l)
std::cout << el << " ";
std::cout << ")" << std::endl;
}
int main()
{
using namespace std;
list<int> li{ 46, 59, 88, 72, 79, 71, 60, 5, 40, 84 };
list<int> le(li.size()); // le = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
list<int> lo(li.size()); // lo = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
cout << "li = ";
listlist(li);
// is_even checks if the element is even.
auto is_even = [](int const elem) { return !(elem % 2); };
// use copy_if to select only even elements from li
// and copy them to le, starting from le's begin position
auto ec = copy_if(li.begin(),li.end(), le.begin(), is_even);
le.resize(std::distance(le.begin(), ec)); // shrink le to new size
cout << "Even numbers are le = ";
listlist(le);
// is_odd checks if the element is odd.
auto is_odd = [](int const elem) { return (elem % 2); };
// use copy_if to select only odd elements from li
// and copy them to lo, starting from lo's begin position
auto oc = copy_if(li.begin(), li.end(), lo.begin(), is_odd);
lo.resize(std::distance(lo.begin(), oc)); // shrink lo to new size
cout << "Odd numbers are lo = ";
listlist(lo);
}
li = ( 46 59 88 72 79 71 60 5 40 84 )
Even numbers are le = ( 46 88 72 60 40 84 )
Odd numbers are lo = ( 59 79 71 5 )
copy_n
Copia um número especificado de elementos.
template<class InputIterator, class Size, class OutputIterator>
OutputIterator copy_n(
InputIterator first,
Size count,
OutputIterator dest);
template<class ExecutionPolicy, class ForwardIterator1, class Size, class ForwardIterator2>
ForwardIterator2 copy_n(
ExecutionPolicy&& exec,
ForwardIterator1 first,
Size count,
ForwardIterator2 dest);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que indica de onde copiar elementos.
count
Um tipo de inteiro assinado ou não assinado especificando o número de elementos a serem copiados.
dest
Um iterador de saída que indica para onde copiar elementos.
Valor de retorno
Retorna um iterador de saída para o qual os elementos foram copiados. É o mesmo que o valor retornado do dest parâmetro.
Observações
A função de modelo avalia *(dest + N) = *(first + N)) uma vez para cada N um no intervalo [0, count), para valores estritamente crescentes de N começar com o menor valor. Em seguida, ele retorna dest + N. Se dest e first designar regiões de armazenamento, dest não deve estar no intervalo [first, last).
Exemplo
// alg_copy_n.cpp
// compile with: cl /EHsc /W4 alg_copy_n.cpp
#include <algorithm>
#include <iostream>
#include <string>
int main()
{
using namespace std;
string s1{"dandelion"};
string s2{"badger"};
cout << s1 << " + " << s2 << " = ";
// Copy the first 3 letters from s1
// to the first 3 positions in s2
copy_n(s1.begin(), 3, s2.begin());
cout << s2 << endl;
}
dandelion + badger = danger
count
Retorna o número de elementos em um intervalo cujos valores correspondem a um valor especificado.
template<class InputIterator, class Type>
typename iterator_traits<InputIterator>::difference_type count(
InputIterator first,
InputIterator last,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator, class Type>
typename iterator_traits<ForwardIterator>::difference_type
count(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
const Type& value);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que aborda a posição do primeiro elemento no intervalo a ser percorrido.
last
Um iterador de entrada que aborda a posição um após o elemento final no intervalo a ser percorrido.
value
O valor dos elementos a serem contados.
Valor de retorno
O tipo de diferença do InputIterator que conta o número de elementos no intervalo [first, last) que têm valor value.
Observações
O operator== usado para determinar a correspondência entre um elemento e o valor especificado deve impor uma relação de equivalência entre seus operandos.
Este algoritmo é generalizado para contar elementos que satisfazem qualquer predicado com a função count_ifde modelo.
Exemplo
// alg_count.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<int> v1;
vector<int>::iterator Iter;
v1.push_back(10);
v1.push_back(20);
v1.push_back(10);
v1.push_back(40);
v1.push_back(10);
cout << "v1 = ( " ;
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << *Iter << " ";
cout << ")" << endl;
vector<int>::iterator::difference_type result;
result = count(v1.begin(), v1.end(), 10);
cout << "The number of 10s in v2 is: " << result << "." << endl;
}
v1 = ( 10 20 10 40 10 )
The number of 10s in v2 is: 3.
count_if
Devolve o número de elementos num intervalo cujos valores satisfazem uma condição especificada.
template<class InputIterator, class UnaryPredicate>
typename iterator_traits<InputIterator>::difference_type count_if(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
typename iterator_traits<ForwardIterator>::difference_type
count_if(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que aborda a posição do primeiro elemento no intervalo a ser pesquisado.
last
Um iterador de entrada abordando a posição um após o elemento final no intervalo a ser pesquisado.
pred
Objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita se um elemento deve ser contado. Um predicado unário pega um único argumento e retorna true ou false.
Valor de retorno
O número de elementos que satisfazem a condição especificada pelo predicado.
Observações
Esta função de modelo é uma generalização do algoritmo count, substituindo o predicado "igual a um valor específico" por qualquer predicado.
Exemplo
// alg_count_if.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
bool greater10(int value)
{
return value > 10;
}
int main()
{
using namespace std;
vector<int> v1;
vector<int>::iterator Iter;
v1.push_back(10);
v1.push_back(20);
v1.push_back(10);
v1.push_back(40);
v1.push_back(10);
cout << "v1 = ( ";
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << *Iter << " ";
cout << ")" << endl;
vector<int>::iterator::difference_type result1;
result1 = count_if(v1.begin(), v1.end(), greater10);
cout << "The number of elements in v1 greater than 10 is: "
<< result1 << "." << endl;
}
v1 = ( 10 20 10 40 10 )
The number of elements in v1 greater than 10 is: 2.
equal
Compara dois intervalos elemento por elemento para igualdade ou equivalência em um sentido especificado por um predicado binário.
Use std::equal ao comparar elementos em diferentes tipos de contêiner (por exemplo vector e list) ou ao comparar diferentes tipos de elementos, ou quando precisar comparar subintervalos de contêineres. Caso contrário, ao comparar elementos do mesmo tipo no mesmo tipo de contêiner, use o não-membro operator== fornecido para cada contêiner.
Use as sobrecargas de intervalo duplo no código C++14 porque as sobrecargas que levam apenas um único iterador para o segundo intervalo não detetarão diferenças se o segundo intervalo for maior do que o primeiro intervalo. Essas sobrecargas resultarão em comportamento indefinido se o segundo intervalo for menor do que o primeiro.
template<class InputIterator1, class InputIterator2>
bool equal(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2);
template<class InputIterator1, class InputIterator2, class BinaryPredicate>
bool equal(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
BinaryPredicate pred); // C++14
template<class InputIterator1, class InputIterator2>
bool equal(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2);
template<class InputIterator1, class InputIterator2, class BinaryPredicate>
bool equal(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
bool equal(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
bool equal(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
bool equal(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
bool equal(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador de entrada que aborda a posição do primeiro elemento no primeiro intervalo a ser testado.
last1
Um iterador de entrada que aborda a posição um após o último elemento no primeiro intervalo a ser testado.
first2
Um iterador de entrada que aborda a posição do primeiro elemento no segundo intervalo a ser testado.
last2
Um iterador de entrada que aborda a posição de um passado o último elemento no segundo intervalo a ser testado.
pred
Objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita se dois elementos devem ser tomados como equivalentes. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
true se e somente se os intervalos forem idênticos ou equivalentes sob o predicado binário quando comparados elemento por elemento; caso contrário, false.
Observações
O intervalo a pesquisar deve ser válido; Todos os iteradores devem ser desreferenciados e a última posição é alcançável a partir da primeira por incremento.
Se os dois intervalos são de comprimento igual, então a complexidade de tempo do algoritmo é linear no número de elementos contidos no intervalo. Caso contrário, a função retorna falseimediatamente.
Você não precisa de nenhum dos dois operator== ou do predicado definido pelo usuário para impor uma relação de equivalência simétrica, reflexiva e transitiva entre seus operandos.
Exemplo
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v1 { 0, 5, 10, 15, 20, 25 };
vector<int> v2 { 0, 5, 10, 15, 20, 25 };
vector<int> v3 { 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 };
// Using range-and-a-half equal:
bool b = equal(v1.begin(), v1.end(), v2.begin());
cout << "v1 and v2 are equal: "
<< b << endl; // true, as expected
b = equal(v1.begin(), v1.end(), v3.begin());
cout << "v1 and v3 are equal: "
<< b << endl; // true, surprisingly
// Using dual-range equal:
b = equal(v1.begin(), v1.end(), v3.begin(), v3.end());
cout << "v1 and v3 are equal with dual-range overload: "
<< b << endl; // false
return 0;
}
v1 and v2 are equal: 1
v1 and v3 are equal: 1
v1 and v3 are equal with dual-range overload: 0
equal_range
Dado um intervalo ordenado, localiza o subintervalo no qual todos os elementos são equivalentes a um determinado valor.
template<class ForwardIterator, class Type>
pair<ForwardIterator, ForwardIterator> equal_range(
ForwardIterator first,
ForwardIterator last,
const Type& value);
template<class ForwardIterator, class Type, class Compare>
pair<ForwardIterator, ForwardIterator> equal_range(
ForwardIterator first,
ForwardIterator last,
const Type& value,
Compare pred);
Parâmetros
first
Um iterador avançado que aborda a posição do primeiro elemento no intervalo a ser pesquisado.
last
Um iterador avançado abordando a posição um após o elemento final no intervalo a ser pesquisado.
value
O valor que está sendo pesquisado no intervalo ordenado.
pred
Objeto de função de predicado definido pelo usuário que define o sentido em que um elemento é menor que outro. Um predicado de comparação usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
Um par de iteradores de encaminhamento que especificam um subintervalo, contido dentro do intervalo pesquisado, no qual todos os elementos são equivalentes no value sentido definido pelo predicado binário usado (ou pred ou o padrão, menor que).
Se nenhum elemento no intervalo for equivalente a value, os iteradores de avanço no par retornado são iguais e especificam o ponto onde value podem ser inseridos sem perturbar a ordem do intervalo.
Observações
O primeiro iterador do par retornado pelo algoritmo é lower_bound, e o segundo iterador é upper_bound.
O intervalo deve ser ordenado de acordo com o predicado fornecido a equal_range. Por exemplo, se você vai usar o predicado maior que ele, o intervalo deve ser classificado em ordem decrescente.
Os elementos no subintervalo possivelmente vazio definido pelo par de iteradores retornados por equal_range serão equivalentes ao valor no sentido definido pelo predicado usado.
A complexidade do algoritmo é logarítmica para iteradores de acesso aleatório e linear de outra forma, com o número de passos proporcional a (last - first).
Exemplo
// alg_equal_range.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // greater<int>()
#include <iostream>
#include <string>
using namespace std;
template<class T> void dump_vector( const vector<T>& v, pair<typename vector<T>::iterator, typename vector<T>::iterator> range )
{
// prints vector v with range delimited by [ and ]
for ( typename vector<T>::const_iterator i = v.begin(); i != v.end(); ++i )
{
if ( i == range.first )
{
cout << "[ ";
}
if ( i == range.second )
{
cout << "] ";
}
cout << *i << " ";
}
cout << endl;
}
template<class T> void equal_range_demo( const vector<T>& original_vector, T value )
{
vector<T> v(original_vector);
sort( v.begin(), v.end() );
cout << "Vector sorted by the default binary predicate <:" << endl << '\t';
for ( typename vector<T>::const_iterator i = v.begin(); i != v.end(); ++i )
{
cout << *i << " ";
}
cout << endl << endl;
pair<typename vector<T>::iterator, typename vector<T>::iterator> result
= equal_range( v.begin(), v.end(), value );
cout << "Result of equal_range with value = " << value << ":" << endl << '\t';
dump_vector( v, result );
cout << endl;
}
template<class T, class F> void equal_range_demo( const vector<T>& original_vector, T value, F pred, string predname )
{
vector<T> v(original_vector);
sort( v.begin(), v.end(), pred );
cout << "Vector sorted by the binary predicate " << predname << ":" << endl << '\t';
for ( typename vector<T>::const_iterator i = v.begin(); i != v.end(); ++i )
{
cout << *i << " ";
}
cout << endl << endl;
pair<typename vector<T>::iterator, typename vector<T>::iterator> result
= equal_range( v.begin(), v.end(), value, pred );
cout << "Result of equal_range with value = " << value << ":" << endl << '\t';
dump_vector( v, result );
cout << endl;
}
// Return whether absolute value of elem1 is less than absolute value of elem2
bool abs_lesser( int elem1, int elem2 )
{
return abs(elem1) < abs(elem2);
}
// Return whether string l is shorter than string r
bool shorter_than(const string& l, const string& r)
{
return l.size() < r.size();
}
int main()
{
vector<int> v1;
// Constructing vector v1 with default less than ordering
for ( int i = -1; i <= 4; ++i )
{
v1.push_back(i);
}
for ( int i =-3; i <= 0; ++i )
{
v1.push_back( i );
}
equal_range_demo( v1, 3 );
equal_range_demo( v1, 3, greater<int>(), "greater" );
equal_range_demo( v1, 3, abs_lesser, "abs_lesser" );
vector<string> v2;
v2.push_back("cute");
v2.push_back("fluffy");
v2.push_back("kittens");
v2.push_back("fun");
v2.push_back("meowmeowmeow");
v2.push_back("blah");
equal_range_demo<string>( v2, "fred" );
equal_range_demo<string>( v2, "fred", shorter_than, "shorter_than" );
}
Vector sorted by the default binary predicate <:
-3 -2 -1 -1 0 0 1 2 3 4
Result of equal_range with value = 3:
-3 -2 -1 -1 0 0 1 2 [ 3 ] 4
Vector sorted by the binary predicate greater:
4 3 2 1 0 0 -1 -1 -2 -3
Result of equal_range with value = 3:
4 [ 3 ] 2 1 0 0 -1 -1 -2 -3
Vector sorted by the binary predicate abs_lesser:
0 0 -1 1 -1 2 -2 3 -3 4
Result of equal_range with value = 3:
0 0 -1 1 -1 2 -2 [ 3 -3 ] 4
Vector sorted by the default binary predicate <:
blah cute fluffy fun kittens meowmeowmeow
Result of equal_range with value = fred:
blah cute fluffy [ ] fun kittens meowmeowmeow
Vector sorted by the binary predicate shorter_than:
fun cute blah fluffy kittens meowmeowmeow
Result of equal_range with value = fred:
fun [ cute blah ] fluffy kittens meowmeowmeow
fill
Atribui o mesmo novo valor a cada elemento em um intervalo especificado.
template<class ForwardIterator, class Type>
void fill(
ForwardIterator first,
ForwardIterator last,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator, class Type>
void fill(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
const Type& value);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador avançado que aborda a posição do primeiro elemento no intervalo a ser percorrido.
last
Um iterador avançado que aborda a posição um após o elemento final no intervalo a ser percorrido.
value
O valor a ser atribuído aos elementos no intervalo [first, last).
Observações
O intervalo de destino deve ser válido; Todos os ponteiros devem ser desreferenciados, e a última posição é alcançável a partir da primeira por incremento. A complexidade é linear com o tamanho do intervalo.
Exemplo
// alg_fill.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1;
int i;
for ( i = 0 ; i <= 9 ; i++ )
{
v1.push_back( 5 * i );
}
cout << "Vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// Fill the last 5 positions with a value of 2
fill( v1.begin( ) + 5, v1.end( ), 2 );
cout << "Modified v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
}
Vector v1 = ( 0 5 10 15 20 25 30 35 40 45 )
Modified v1 = ( 0 5 10 15 20 2 2 2 2 2 )
fill_n
Atribui um novo valor a um número especificado de elementos em um intervalo que começa com um elemento específico.
template<class OutputIterator, class Size, class Type>
OutputIterator fill_n(
OutputIterator first,
Size count,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator, class Size, class Type>
ForwardIterator fill_n(
ExecutionPolicy&& exec,
ForwardIterator first,
Size count,
const Type& value);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de saída que aborda a posição do primeiro elemento no intervalo ao qual será atribuído o valor value.
count
Um tipo inteiro assinado ou não assinado especificando o número de elementos aos quais será atribuído o valor.
value
O valor a ser atribuído aos elementos no intervalo [first, first + count).
Valor de retorno
Um iterador para o elemento que segue o último elemento preenchido se count> zero, caso contrário, o primeiro elemento.
Observações
O intervalo de destino deve ser válido; Todos os ponteiros devem ser desreferenciados, e a última posição é alcançável a partir da primeira por incremento. A complexidade é linear com o tamanho do intervalo.
Exemplo
// alg_fill_n.cpp
// compile using /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<int> v;
for ( auto i = 0 ; i < 9 ; ++i )
v.push_back( 0 );
cout << "vector v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
// Fill the first 3 positions with a value of 1, saving position.
auto pos = fill_n( v.begin(), 3, 1 );
cout << "modified v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
// Fill the next 3 positions with a value of 2, using last position.
fill_n( pos, 3, 2 );
cout << "modified v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
// Fill the last 3 positions with a value of 3, using relative math.
fill_n( v.end()-3, 3, 3 );
cout << "modified v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
}
vector v = ( 0 0 0 0 0 0 0 0 0 )
modified v = ( 1 1 1 0 0 0 0 0 0 )
modified v = ( 1 1 1 2 2 2 0 0 0 )
modified v = ( 1 1 1 2 2 2 3 3 3 )
find
Localiza a posição da primeira ocorrência de um elemento em um intervalo que tem um valor especificado.
template<class InputIterator, class Type>
InputIterator find(
InputIterator first,
InputIterator last,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator, class Type>
ForwardIterator find(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
const Type& value);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que aborda a posição do primeiro elemento no intervalo a ser pesquisado para o valor especificado.
last
Um iterador de entrada endereçando a posição um após o elemento final no intervalo a ser pesquisado para o valor especificado.
value
O valor a ser pesquisado.
Valor de retorno
Um iterador de entrada que aborda a primeira ocorrência do valor especificado no intervalo que está sendo pesquisado. Se nenhum elemento for encontrado com um valor equivalente, retornará last.
Observações
O operator== usado para determinar a correspondência entre um elemento e o valor especificado deve impor uma relação de equivalência entre seus operandos.
Para obter um exemplo de código usando find()o , consulte find_if.
find_end
Procura em um intervalo a última subsequência que é idêntica a uma sequência especificada ou que é equivalente em um sentido especificado por um predicado binário.
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_end(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ForwardIterator1, class ForwardIterator2, class Pred>
ForwardIterator1 find_end(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
Pred pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator1
find_end(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1,
class ForwardIterator2, class BinaryPredicate>
ForwardIterator1
find_end(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
Parâmetros
first1
Um iterador avançado que aborda a posição do primeiro elemento no intervalo a ser pesquisado.
last1
Um iterador de encaminhamento abordando a posição um após o último elemento no intervalo a ser pesquisado.
first2
Um iterador avançado abordando a posição do primeiro elemento no intervalo a ser pesquisado.
last2
Um iterador avançado que aborda a posição um após o último elemento no intervalo a ser pesquisado.
pred
Objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita se dois elementos devem ser tomados como equivalentes. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
Um iterador avançado que aborda a posição do primeiro elemento da última subsequência dentro de [first1, last1) que corresponde à sequência especificada [first2, last2).
Observações
O operator== usado para determinar a correspondência entre um elemento e o valor especificado deve impor uma relação de equivalência entre seus operandos.
Os intervalos referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição é alcançável a partir da primeira por incremento.
Exemplo
// alg_find_end.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
// Return whether second element is twice the first
bool twice ( int elem1, int elem2 )
{
return 2 * elem1 == elem2;
}
int main()
{
using namespace std;
vector<int> v1, v2;
list<int> L1;
vector<int>::iterator Iter1, Iter2;
list<int>::iterator L1_Iter, L1_inIter;
int i;
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 5 * i );
}
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 5 * i );
}
int ii;
for ( ii = 1 ; ii <= 4 ; ii++ )
{
L1.push_back( 5 * ii );
}
int iii;
for ( iii = 2 ; iii <= 4 ; iii++ )
{
v2.push_back( 10 * iii );
}
cout << "Vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "List L1 = ( " ;
for ( L1_Iter = L1.begin( ) ; L1_Iter!= L1.end( ) ; L1_Iter++ )
cout << *L1_Iter << " ";
cout << ")" << endl;
cout << "Vector v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// Searching v1 for a match to L1 under identity
vector<int>::iterator result1;
result1 = find_end ( v1.begin( ), v1.end( ), L1.begin( ), L1.end( ) );
if ( result1 == v1.end( ) )
cout << "There is no match of L1 in v1."
<< endl;
else
cout << "There is a match of L1 in v1 that begins at "
<< "position "<< result1 - v1.begin( ) << "." << endl;
// Searching v1 for a match to L1 under the binary predicate twice
vector<int>::iterator result2;
result2 = find_end ( v1.begin( ), v1.end( ), v2.begin( ), v2.end( ), twice );
if ( result2 == v1.end( ) )
cout << "There is no match of L1 in v1."
<< endl;
else
cout << "There is a sequence of elements in v1 that "
<< "are equivalent to those\n in v2 under the binary "
<< "predicate twice and that begins at position "
<< result2 - v1.begin( ) << "." << endl;
}
Vector v1 = ( 0 5 10 15 20 25 0 5 10 15 20 25 )
List L1 = ( 5 10 15 20 )
Vector v2 = ( 20 30 40 )
There is a match of L1 in v1 that begins at position 7.
There is a sequence of elements in v1 that are equivalent to those
in v2 under the binary predicate twice and that begins at position 8.
find_first_of
Procura a primeira ocorrência de qualquer um dos vários valores dentro de um intervalo de destino. Ou, procura a primeira ocorrência de qualquer um dos vários elementos que são equivalentes em um sentido especificado por um predicado binário para um conjunto especificado de elementos.
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_first_of(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 find_first_of(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator1
find_first_of(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1,
class ForwardIterator2, class BinaryPredicate>
ForwardIterator1
find_first_of(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
Parâmetros
first1
Um iterador avançado que aborda a posição do primeiro elemento no intervalo a ser pesquisado.
last1
Um iterador avançado abordando a posição um após o elemento final no intervalo a ser pesquisado.
first2
Um iterador avançado abordando a posição do primeiro elemento no intervalo a ser correspondido.
last2
Um iterador avançado que aborda a posição um após o elemento final no intervalo a ser correspondido.
pred
Objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita se dois elementos devem ser tomados como equivalentes. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
Um iterador de encaminhamento que aborda a posição do primeiro elemento da primeira subsequência que corresponde à sequência especificada ou que é equivalente em um sentido especificado por um predicado binário.
Observações
O operator== usado para determinar a correspondência entre um elemento e o valor especificado deve impor uma relação de equivalência entre seus operandos.
Os intervalos referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição é alcançável a partir da primeira por incremento.
Exemplo
// alg_find_first_of.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
// Return whether second element is twice the first
bool twice ( int elem1, int elem2 )
{
return 2 * elem1 == elem2;
}
int main()
{
using namespace std;
vector<int> v1, v2;
list<int> L1;
vector<int>::iterator Iter1, Iter2;
list<int>::iterator L1_Iter, L1_inIter;
int i;
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 5 * i );
}
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 5 * i );
}
int ii;
for ( ii = 3 ; ii <= 4 ; ii++ )
{
L1.push_back( 5 * ii );
}
int iii;
for ( iii = 2 ; iii <= 4 ; iii++ )
{
v2.push_back( 10 * iii );
}
cout << "Vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "List L1 = ( " ;
for ( L1_Iter = L1.begin( ) ; L1_Iter!= L1.end( ) ; L1_Iter++ )
cout << *L1_Iter << " ";
cout << ")" << endl;
cout << "Vector v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// Searching v1 for first match to L1 under identity
vector<int>::iterator result1;
result1 = find_first_of ( v1.begin( ), v1.end( ), L1.begin( ), L1.end( ) );
if ( result1 == v1.end( ) )
cout << "There is no match of L1 in v1."
<< endl;
else
cout << "There is at least one match of L1 in v1"
<< "\n and the first one begins at "
<< "position "<< result1 - v1.begin( ) << "." << endl;
// Searching v1 for a match to L1 under the binary predicate twice
vector<int>::iterator result2;
result2 = find_first_of ( v1.begin( ), v1.end( ), v2.begin( ), v2.end( ), twice );
if ( result2 == v1.end( ) )
cout << "There is no match of L1 in v1."
<< endl;
else
cout << "There is a sequence of elements in v1 that "
<< "are equivalent\n to those in v2 under the binary "
<< "predicate twice\n and the first one begins at position "
<< result2 - v1.begin( ) << "." << endl;
}
Vector v1 = ( 0 5 10 15 20 25 0 5 10 15 20 25 )
List L1 = ( 15 20 )
Vector v2 = ( 20 30 40 )
There is at least one match of L1 in v1
and the first one begins at position 3.
There is a sequence of elements in v1 that are equivalent
to those in v2 under the binary predicate twice
and the first one begins at position 2.
find_if
Localiza a posição da primeira ocorrência de um elemento em um intervalo que satisfaz uma condição especificada.
template<class InputIterator, class UnaryPredicate>
InputIterator find_if(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
ForwardIterator find_if(
ExecutionPolicy&& exec,
ForwardIterator first, ForwardIterator last,
UnaryPredicate pred);
Parâmetros
first
Um iterador de entrada que aborda a posição do primeiro elemento no intervalo a ser pesquisado.
last
Um iterador de entrada abordando a posição um após o elemento final no intervalo a ser pesquisado.
pred
Objeto de função de predicado definido pelo usuário ou expressão lambda que define a condição a ser satisfeita pelo elemento que está sendo pesquisado. Um predicado unário pega um único argumento e retorna true se satisfeito, ou false se não estiver satisfeito. A assinatura de pred deve ser bool pred(const T& arg);efetivamente , onde T é um tipo para o qual InputIterator pode ser implicitamente convertido quando desreferenciado. A const palavra-chave é mostrada apenas para ilustrar que o objeto de função ou lambda não deve modificar o argumento.
Valor de retorno
Um iterador de entrada que se refere ao primeiro elemento no intervalo que satisfaz a condição especificada pelo predicado (o predicado resulta em true). Se nenhum elemento for encontrado para satisfazer o predicado, retorna last.
Observações
Esta função de modelo é uma generalização do algoritmo find, substituindo o predicado "igual a um valor específico" por qualquer predicado. Para o oposto lógico (encontrar o primeiro elemento que não satisfaz o predicado), ver find_if_not.
Exemplo
// cl.exe /W4 /nologo /EHsc /MTd
#include <vector>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
template <typename S> void print(const S& s) {
for (const auto& p : s) {
cout << "(" << p << ") ";
}
cout << endl;
}
// Test std::find()
template <class InputIterator, class T>
void find_print_result(InputIterator first, InputIterator last, const T& value) {
// call <algorithm> std::find()
auto p = find(first, last, value);
cout << "value " << value;
if (p == last) {
cout << " not found." << endl;
} else {
cout << " found." << endl;
}
}
// Test std::find_if()
template <class InputIterator, class Predicate>
void find_if_print_result(InputIterator first, InputIterator last,
Predicate Pred, const string& Str) {
// call <algorithm> std::find_if()
auto p = find_if(first, last, Pred);
if (p == last) {
cout << Str << " not found." << endl;
} else {
cout << "first " << Str << " found: " << *p << endl;
}
}
// Function to use as the UnaryPredicate argument to find_if() in this example
bool is_odd_int(int i) {
return ((i % 2) != 0);
}
int main()
{
// Test using a plain old array.
const int x[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
cout << "array x[] contents: ";
print(x);
// Using non-member std::begin()/std::end() to get input iterators for the plain old array.
cout << "Test std::find() with array..." << endl;
find_print_result(begin(x), end(x), 10);
find_print_result(begin(x), end(x), 42);
cout << "Test std::find_if() with array..." << endl;
find_if_print_result(begin(x), end(x), is_odd_int, "odd integer"); // function name
find_if_print_result(begin(x), end(x), // lambda
[](int i){ return ((i % 2) == 0); }, "even integer");
// Test using a vector.
vector<int> v;
for (int i = 0; i < 10; ++i) {
v.push_back((i + 1) * 10);
}
cout << endl << "vector v contents: ";
print(v);
cout << "Test std::find() with vector..." << endl;
find_print_result(v.begin(), v.end(), 20);
find_print_result(v.begin(), v.end(), 12);
cout << "Test std::find_if() with vector..." << endl;
find_if_print_result(v.begin(), v.end(), is_odd_int, "odd integer");
find_if_print_result(v.begin(), v.end(), // lambda
[](int i){ return ((i % 2) == 0); }, "even integer");
}
array x[] contents: (1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
Test std::find() with array...
value 10 found.
value 42 not found.
Test std::find_if() with array...
first odd integer found: 1
first even integer found: 2
vector v contents: (10) (20) (30) (40) (50) (60) (70) (80) (90) (100)
Test std::find() with vector...
value 20 found.
value 12 not found.
Test std::find_if() with vector...
odd integer not found.
first even integer found: 10
find_if_not
Retorna o primeiro elemento no intervalo indicado que não satisfaz uma condição.
template<class InputIterator, class UnaryPredicate>
InputIterator find_if_not(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
ForwardIterator find_if_not(
ExecutionPolicy&& exec,
ForwardIterator first, ForwardIterator last,
UnaryPredicate pred);
Parâmetros
first
Um iterador de entrada que aborda a posição do primeiro elemento no intervalo a ser pesquisado.
last
Um iterador de entrada abordando a posição um após o elemento final no intervalo a ser pesquisado.
pred
Objeto de função de predicado definido pelo usuário ou expressão lambda que define a condição a ser não satisfeita pelo elemento que está sendo pesquisado. Um predicado unário pega um único argumento e retorna true se satisfeito, ou false se não estiver satisfeito. A assinatura de pred deve ser bool pred(const T& arg);efetivamente , onde T é um tipo para o qual InputIterator pode ser implicitamente convertido quando desreferenciado. A const palavra-chave é mostrada apenas para ilustrar que o objeto de função ou lambda não deve modificar o argumento.
Valor de retorno
Um iterador de entrada que se refere ao primeiro elemento no intervalo que não satisfaz a condição especificada pelo predicado (o predicado resulta em false). Se todos os elementos satisfizerem o predicado (o predicado resulta em true para cada elemento), retorna last.
Observações
Esta função de modelo é uma generalização do algoritmo find, substituindo o predicado "igual a um valor específico" por qualquer predicado. Para o oposto lógico (encontrar o primeiro elemento que satisfaz o predicado), ver find_if.
Para obter um exemplo de código facilmente adaptável ao find_if_not(), consulte find_if.
for_each
Aplica um objeto de função especificado a cada elemento em uma ordem de encaminhamento dentro de um intervalo e retorna o objeto de função.
template<class InputIterator, class Function>
Function for_each(
InputIterator first,
InputIterator last,
Function func);
template<class ExecutionPolicy, class ForwardIterator, class Function>
void for_each(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Function func);
Parâmetros
first
Um iterador de entrada que aborda a posição do primeiro elemento no intervalo para operar.
last
Um iterador de entrada abordando a posição um após o elemento final no intervalo operado.
func
Objeto de função definido pelo usuário que é aplicado a cada elemento no intervalo.
Valor de retorno
Uma cópia do objeto de função depois de ter sido aplicado a todos os elementos no intervalo.
Observações
O algoritmo for_each é flexível, permitindo a modificação de cada elemento dentro de um intervalo de maneiras diferentes, especificadas pelo usuário. As funções templatizadas podem ser reutilizadas de forma modificada passando parâmetros diferentes. As funções definidas pelo usuário podem acumular informações dentro de um estado interno que o algoritmo pode retornar após o processamento de todos os elementos no intervalo.
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição deve ser alcançável a partir da primeira por incremento.
A complexidade é linear com, no máximo, comparações (last - first).
Exemplo
// alg_for_each.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
// The function object multiplies an element by a Factor
template <class Type>
class MultValue
{
private:
Type Factor; // The value to multiply by
public:
// Constructor initializes the value to multiply by
MultValue ( const Type& value ) : Factor ( value ) {
}
// The function call for the element to be multiplied
void operator( ) ( Type& elem ) const
{
elem *= Factor;
}
};
// The function object to determine the average
class Average
{
private:
long num; // The number of elements
long sum; // The sum of the elements
public:
// Constructor initializes the value to multiply by
Average( ) : num ( 0 ) , sum ( 0 )
{
}
// The function call to process the next elment
void operator( ) ( int elem )
{
num++; // Increment the element count
sum += elem; // Add the value to the partial sum
}
// return Average
operator double( )
{
return static_cast<double> (sum) /
static_cast<double> (num);
}
};
int main()
{
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1;
// Constructing vector v1
int i;
for ( i = -4 ; i <= 2 ; i++ )
{
v1.push_back( i );
}
cout << "Original vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Using for_each to multiply each element by a Factor
for_each ( v1.begin( ), v1.end( ), MultValue<int> ( -2 ) );
cout << "Multiplying the elements of the vector v1\n "
<< "by the factor -2 gives:\n v1mod1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// The function object is templatized and so can be
// used again on the elements with a different Factor
for_each ( v1.begin( ), v1.end( ), MultValue<int> ( 5 ) );
cout << "Multiplying the elements of the vector v1mod\n "
<< "by the factor 5 gives:\n v1mod2 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// The local state of a function object can accumulate
// information about a sequence of actions that the
// return value can make available, here the Average
double avemod2 = for_each ( v1.begin( ), v1.end( ),
Average( ) );
cout << "The average of the elements of v1 is:\n Average ( v1mod2 ) = "
<< avemod2 << "." << endl;
}
Original vector v1 = ( -4 -3 -2 -1 0 1 2 ).
Multiplying the elements of the vector v1
by the factor -2 gives:
v1mod1 = ( 8 6 4 2 0 -2 -4 ).
Multiplying the elements of the vector v1mod
by the factor 5 gives:
v1mod2 = ( 40 30 20 10 0 -10 -20 ).
The average of the elements of v1 is:
Average ( v1mod2 ) = 10.
for_each_n
Aplica um objeto de função especificado a um número especificado de elementos em um intervalo que começa com um elemento específico.
template<class InputIterator, class Size, class Function>
InputIterator for_each_n(
InputIterator first,
Size count,
Function func);
template<class ExecutionPolicy, class ForwardIterator, class Size, class Function>
ForwardIterator for_each_n(
ExecutionPolicy&& exec,
ForwardIterator first,
Size count,
Function func);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada na posição do primeiro elemento no intervalo para operar.
count
O número de elementos para operar.
func
Um objeto de função definido pelo usuário para aplicar a cada elemento no intervalo [first, first + count).
Valor de retorno
Um iterador para o elemento que segue o último elemento processado se count> zero, caso contrário, o primeiro elemento.
Observações
count deve ser não-negativo, e deve haver pelo menos count elementos no intervalo a partir de first.
Exemplo
Este exemplo define uma classe de objeto de função. O código de produção geralmente usa a lambda para obter o mesmo resultado com menos código.
// alg_for_each_n.cpp
// compile with /EHsc and /std:c++17 (or higher)
#include <algorithm>
#include <iostream>
#include <vector>
// The function object multiplies an element by a Factor
template <class Type> class MultValue
{
private:
Type Factor; // The value to multiply each element by
public:
// Constructor initializes the value to multiply by
MultValue(const Type &value) : Factor(value) {}
// The function call for the element to be multiplied
void operator()(Type &elem) const
{
elem *= Factor;
}
};
// Utility to display the contents of a vector
template <class T> void print_vector(const std::vector<T> &vec)
{
std::cout << "( ";
for (auto iter = vec.begin(); iter != vec.end(); iter++)
{
std::cout << *iter << ' ';
}
std::cout << ").\n";
}
int main()
{
std::vector<int> v;
// Construct vector with the elements -4...2
for (int i = -4; i <= 2; i++)
{
v.push_back(i);
}
std::cout << "Original vector v = ";
print_vector(v);
// Use for_each_n to multiply the first 3 elements by a Factor,
// saving the position in the vector after the first 3 elements
auto pos = for_each_n(v.begin(), 3, MultValue<int>(-2));
std::cout << "Multiplying the first 3 elements of the vector v\n "
<< "by the factor -2 gives:\n vmod1 = ";
print_vector(v);
// Using for_each_n to multiply the next 4 elements by a Factor,
// starting at the position saved by the previous for_each_n
for_each_n(pos, 4, MultValue<int>(-3));
std::cout << "Multiplying the next 4 elements of the vector v\n "
<< "by the factor -3 gives:\n vmod2 = ";
print_vector(v);
return 0;
}
Original vector v = ( -4 -3 -2 -1 0 1 2 ).
Multiplying the first 3 elements of the vector v
by the factor -2 gives:
vmod1 = ( 8 6 4 -1 0 1 2 ).
Multiplying the next 4 elements of the vector v
by the factor -3 gives:
vmod2 = ( 8 6 4 3 0 -3 -6 ).
generate
Atribui os valores gerados por um objeto de função a cada elemento em um intervalo.
template<class ForwardIterator, class Generator>
void generate(
ForwardIterator first,
ForwardIterator last,
Generator gen);
template<class ExecutionPolicy, class ForwardIterator, class Generator>
void generate(
ExecutionPolicy&& exec,
ForwardIterator first, ForwardIterator last,
Generator gen);
Parâmetros
first
Um iterador de encaminhamento na posição do primeiro elemento no intervalo ao qual os valores devem ser atribuídos.
last
Um iterador de encaminhamento na posição um após o elemento final no intervalo ao qual os valores devem ser atribuídos.
gen
Um objeto de função que é chamado sem argumentos para gerar os valores a serem atribuídos a cada um dos elementos no intervalo.
Observações
O objeto de função é invocado para cada elemento no intervalo e não precisa retornar o mesmo valor cada vez que é chamado. Pode, por exemplo, ler a partir de um ficheiro ou referir-se e modificar um estado local. O tipo de resultado do gerador deve ser conversível para o tipo de valor do iterador de encaminhamento para o intervalo.
O intervalo referenciado deve ser válido. Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição deve ser alcançável a partir da primeira por incremento.
A complexidade é linear, com exatamente last - first chamadas feitas para o gerador.
Exemplo
// alg_generate.cpp
// compile with: /EHsc
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
#include <ostream>
int main()
{
using namespace std;
// Assigning random values to vector integer elements
vector<int> v1 ( 5 );
vector<int>::iterator Iter1;
deque<int> deq1 ( 5 );
deque<int>::iterator d1_Iter;
generate ( v1.begin( ), v1.end( ), rand );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Assigning random values to deque integer elements
generate ( deq1.begin( ), deq1.end( ), rand );
cout << "Deque deq1 is ( " ;
for ( d1_Iter = deq1.begin( ) ; d1_Iter != deq1.end( ) ; d1_Iter++ )
cout << *d1_Iter << " ";
cout << ")." << endl;
}
Vector v1 is ( 41 18467 6334 26500 19169 ).
Deque deq1 is ( 15724 11478 29358 26962 24464 ).
generate_n
Atribui os valores gerados por um objeto de função a um número especificado de elementos em um intervalo. Devolve a posição um após o último valor atribuído.
template<class OutputIterator, class Diff, class Generator>
void generate_n(
OutputIterator first,
Diff count,
Generator gen);
template<class ExecutionPolicy, class ForwardIterator, class Size, class Generator>
ForwardIterator generate_n(
ExecutionPolicy&& exec,
ForwardIterator first,
Size count,
Generator gen);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de saída que aborda a posição do primeiro elemento no intervalo ao qual os valores devem ser atribuídos.
count
Um tipo inteiro assinado ou não assinado especificando o número de elementos aos quais será atribuído um valor pela função geradora.
gen
Um objeto de função que é chamado sem argumentos que é usado para gerar os valores a serem atribuídos a cada um dos elementos no intervalo.
Observações
O objeto de função é invocado para cada elemento no intervalo e não precisa retornar o mesmo valor cada vez que é chamado. Pode, por exemplo, ler a partir de um ficheiro ou referir-se e modificar um estado local. O tipo de resultado do gerador deve ser conversível para o tipo de valor dos iteradores de encaminhamento para o intervalo.
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição deve ser alcançável a partir da primeira por incremento.
A complexidade é linear, sendo necessárias exatamente count chamadas para o gerador.
Exemplo
// cl.exe /EHsc /nologo /W4 /MTd
#include <vector>
#include <deque>
#include <iostream>
#include <string>
#include <algorithm>
#include <random>
using namespace std;
template <typename C>
void print(const string& s, const C& c)
{
cout << s;
for (const auto& e : c) {
cout << e << " ";
}
cout << endl;
}
int main()
{
const int elemcount = 5;
vector<int> v(elemcount);
deque<int> dq(elemcount);
// Set up random number distribution
random_device rd;
mt19937 engine(rd());
uniform_int_distribution<int> dist(-9, 9);
// Call generate_n, using a lambda for the third parameter
generate_n(v.begin(), elemcount, [&](){ return dist(engine); });
print("vector v is: ", v);
generate_n(dq.begin(), elemcount, [&](){ return dist(engine); });
print("deque dq is: ", dq);
}
vector v is: 5 8 2 -9 6
deque dq is: 7 6 9 3 4
includes
Testa se um intervalo classificado contém todos os elementos contidos num segundo intervalo ordenado, onde o critério de ordenação ou equivalência entre elementos pode ser especificado por um predicado binário.
template<class InputIterator1, class InputIterator2>
bool includes(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2);
template<class InputIterator1, class InputIterator2, class Compare>
bool includes(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
Compare pred );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
bool includes(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class Compare>
bool includes(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador de entrada abordando a posição do primeiro elemento no primeiro de dois intervalos de fontes classificados a ser testado para verificar se todos os elementos do segundo estão contidos no primeiro.
last1
Um iterador de entrada abordando a posição um após o último elemento no primeiro de dois intervalos de origem classificados a ser testado para saber se todos os elementos do segundo estão contidos no primeiro.
first2
Um iterador de entrada que aborda a posição do primeiro elemento no segundo de dois intervalos de fontes classificados consecutivos a ser testado para verificar se todos os elementos do segundo estão contidos no primeiro.
last2
Um iterador de entrada abordando a posição um após o último elemento no segundo de dois intervalos de fontes classificados consecutivos a ser testado para verificar se todos os elementos do segundo estão contidos no primeiro.
pred
Objeto de função de predicado definido pelo usuário que define o sentido no qual um elemento é menor que outro. Um predicado de comparação usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
true se o primeiro intervalo ordenado contiver todos os elementos no segundo intervalo ordenado; caso contrário, false.
Observações
Outra maneira de pensar nesse teste é que ele determinou se o segundo intervalo de origem é um subconjunto do primeiro intervalo de origem.
Os intervalos de origem classificados referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição deve ser alcançável a partir da primeira por incremento.
Como pré-condição para a aplicação do algoritmo includes, os intervalos de origem classificados devem ser organizados com a mesma ordenação usada pelo algoritmo para classificar os intervalos combinados.
Os intervalos de origem não são modificados pelo algoritmo merge.
Os tipos de valor dos iteradores de entrada devem ser menores do que comparáveis para serem encomendados. Ou seja, dados dois elementos, você pode determinar que um é menor que o outro, ou que eles são equivalentes. (Aqui, equivalente significa que nenhum é menor que o outro.) Esta comparação resulta numa ordenação entre os elementos não equivalentes. Mais precisamente, o algoritmo testa se todos os elementos no primeiro intervalo classificado sob um predicado binário especificado têm ordenação equivalente aos do segundo intervalo classificado.
A complexidade do algoritmo é linear com, no máximo 2 * ((last1 - first1) + (last2 - first2)) - 1 , comparações para intervalos de fontes não vazias.
Exemplo
// alg_includes.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser (int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
}
int main()
{
using namespace std;
vector<int> v1a, v1b;
vector<int>::iterator Iter1a, Iter1b;
// Constructing vectors v1a & v1b with default less-than ordering
int i;
for ( i = -2 ; i <= 4 ; i++ )
{
v1a.push_back( i );
}
int ii;
for ( ii =-2 ; ii <= 3 ; ii++ )
{
v1b.push_back( ii );
}
cout << "Original vector v1a with range sorted by the\n "
<< "binary predicate less than is v1a = ( " ;
for ( Iter1a = v1a.begin( ) ; Iter1a != v1a.end( ) ; Iter1a++ )
cout << *Iter1a << " ";
cout << ")." << endl;
cout << "Original vector v1b with range sorted by the\n "
<< "binary predicate less than is v1b = ( " ;
for ( Iter1b = v1b.begin( ) ; Iter1b != v1b.end( ) ; Iter1b++ )
cout << *Iter1b << " ";
cout << ")." << endl;
// Constructing vectors v2a & v2b with ranges sorted by greater
vector<int> v2a ( v1a ) , v2b ( v1b );
vector<int>::iterator Iter2a, Iter2b;
sort ( v2a.begin( ), v2a.end( ), greater<int>( ) );
sort ( v2b.begin( ), v2b.end( ), greater<int>( ) );
v2a.pop_back( );
cout << "Original vector v2a with range sorted by the\n "
<< "binary predicate greater is v2a = ( " ;
for ( Iter2a = v2a.begin( ) ; Iter2a != v2a.end( ) ; Iter2a++ )
cout << *Iter2a << " ";
cout << ")." << endl;
cout << "Original vector v2b with range sorted by the\n "
<< "binary predicate greater is v2b = ( " ;
for ( Iter2b = v2b.begin( ) ; Iter2b != v2b.end( ) ; Iter2b++ )
cout << *Iter2b << " ";
cout << ")." << endl;
// Constructing vectors v3a & v3b with ranges sorted by mod_lesser
vector<int> v3a ( v1a ), v3b ( v1b ) ;
vector<int>::iterator Iter3a, Iter3b;
reverse (v3a.begin( ), v3a.end( ) );
v3a.pop_back( );
v3a.pop_back( );
sort ( v3a.begin( ), v3a.end( ), mod_lesser );
sort ( v3b.begin( ), v3b.end( ), mod_lesser );
cout << "Original vector v3a with range sorted by the\n "
<< "binary predicate mod_lesser is v3a = ( " ;
for ( Iter3a = v3a.begin( ) ; Iter3a != v3a.end( ) ; Iter3a++ )
cout << *Iter3a << " ";
cout << ")." << endl;
cout << "Original vector v3b with range sorted by the\n "
<< "binary predicate mod_lesser is v3b = ( " ;
for ( Iter3b = v3b.begin( ) ; Iter3b != v3b.end( ) ; Iter3b++ )
cout << *Iter3b << " ";
cout << ")." << endl;
// To test for inclusion under an asscending order
// with the default binary predicate less<int>( )
bool Result1;
Result1 = includes ( v1a.begin( ), v1a.end( ),
v1b.begin( ), v1b.end( ) );
if ( Result1 )
cout << "All the elements in vector v1b are "
<< "contained in vector v1a." << endl;
else
cout << "At least one of the elements in vector v1b "
<< "is not contained in vector v1a." << endl;
// To test for inclusion under descending
// order specify binary predicate greater<int>( )
bool Result2;
Result2 = includes ( v2a.begin( ), v2a.end( ),
v2b.begin( ), v2b.end( ), greater<int>( ) );
if ( Result2 )
cout << "All the elements in vector v2b are "
<< "contained in vector v2a." << endl;
else
cout << "At least one of the elements in vector v2b "
<< "is not contained in vector v2a." << endl;
// To test for inclusion under a user
// defined binary predicate mod_lesser
bool Result3;
Result3 = includes ( v3a.begin( ), v3a.end( ),
v3b.begin( ), v3b.end( ), mod_lesser );
if ( Result3 )
cout << "All the elements in vector v3b are "
<< "contained under mod_lesser in vector v3a."
<< endl;
else
cout << "At least one of the elements in vector v3b is "
<< " not contained under mod_lesser in vector v3a."
<< endl;
}
Original vector v1a with range sorted by the
binary predicate less than is v1a = ( -2 -1 0 1 2 3 4 ).
Original vector v1b with range sorted by the
binary predicate less than is v1b = ( -2 -1 0 1 2 3 ).
Original vector v2a with range sorted by the
binary predicate greater is v2a = ( 4 3 2 1 0 -1 ).
Original vector v2b with range sorted by the
binary predicate greater is v2b = ( 3 2 1 0 -1 -2 ).
Original vector v3a with range sorted by the
binary predicate mod_lesser is v3a = ( 0 1 2 3 4 ).
Original vector v3b with range sorted by the
binary predicate mod_lesser is v3b = ( 0 -1 1 -2 2 3 ).
All the elements in vector v1b are contained in vector v1a.
At least one of the elements in vector v2b is not contained in vector v2a.
At least one of the elements in vector v3b is not contained under mod_lesser in vector v3a.
inplace_merge
Combina os elementos de dois intervalos classificados consecutivos em um único intervalo classificado, onde o critério de ordenação pode ser especificado por um predicado binário.
template<class BidirectionalIterator>
void inplace_merge(
BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last);
template<class BidirectionalIterator, class Compare>
void inplace_merge(
BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last,
Compare pred);
template<class ExecutionPolicy, class BidirectionalIterator>
void inplace_merge(
ExecutionPolicy&& exec,
BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last);
template<class ExecutionPolicy, class BidirectionalIterator, class Compare>
void inplace_merge(
ExecutionPolicy&& exec,
BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador bidirecional que aborda a posição do primeiro elemento no primeiro de dois intervalos classificados consecutivos a serem combinados e classificados em um único intervalo.
middle
Um iterador bidirecional que aborda a posição do primeiro elemento no segundo de dois intervalos classificados consecutivos a serem combinados e classificados em um único intervalo.
last
Um iterador bidirecional que aborda a posição um após o último elemento no segundo de dois intervalos classificados consecutivos a serem combinados e classificados em um único intervalo.
pred
Objeto de função de predicado definido pelo usuário que define o sentido em que um elemento é menor que outro. O predicado de comparação usa dois argumentos e deve retornar true quando o primeiro elemento é menor que o segundo elemento e false caso contrário.
Observações
Os intervalos consecutivos classificados referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição deve ser alcançável a partir da primeira por incremento.
Os intervalos consecutivos ordenados devem ser organizados como uma pré-condição para a aplicação do inplace_merge algoritmo de acordo com a mesma ordem que deve ser usada pelo algoritmo para classificar os intervalos combinados. A operação é estável à medida que a ordem relativa dos elementos dentro de cada intervalo é preservada. Quando há elementos equivalentes em ambos os intervalos de origem, o elemento é o primeiro intervalo precede o elemento do segundo no intervalo combinado.
A complexidade depende da memória disponível, pois o algoritmo aloca memória para um buffer temporário. Se houver memória suficiente disponível, o melhor caso é linear com (last - first) - 1 comparações, se não houver memória auxiliar disponível, o pior caso é N log(N), onde N = last - first.
Exemplo
// alg_inplace_merge.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> //For greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
}
int main()
{
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1, Iter2, Iter3;
// Constructing vector v1 with default less-than ordering
int i;
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( i );
}
int ii;
for ( ii =-5 ; ii <= 0 ; ii++ )
{
v1.push_back( ii );
}
cout << "Original vector v1 with subranges sorted by the\n "
<< "binary predicate less than is v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// Constructing vector v2 with ranges sorted by greater
vector<int> v2 ( v1 );
vector<int>::iterator break2;
break2 = find ( v2.begin( ), v2.end( ), -5 );
sort ( v2.begin( ), break2 , greater<int>( ) );
sort ( break2 , v2.end( ), greater<int>( ) );
cout << "Original vector v2 with subranges sorted by the\n "
<< "binary predicate greater is v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// Constructing vector v3 with ranges sorted by mod_lesser
vector<int> v3 ( v1 );
vector<int>::iterator break3;
break3 = find ( v3.begin( ), v3.end( ), -5 );
sort ( v3.begin( ), break3 , mod_lesser );
sort ( break3 , v3.end( ), mod_lesser );
cout << "Original vector v3 with subranges sorted by the\n "
<< "binary predicate mod_lesser is v3 = ( " ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")" << endl;
vector<int>::iterator break1;
break1 = find (v1.begin( ), v1.end( ), -5 );
inplace_merge ( v1.begin( ), break1, v1.end( ) );
cout << "Merged inplace with default order,\n vector v1mod = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// To merge inplace in descending order, specify binary
// predicate greater<int>( )
inplace_merge ( v2.begin( ), break2 , v2.end( ) , greater<int>( ) );
cout << "Merged inplace with binary predicate greater specified,\n "
<< "vector v2mod = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// Applying a user defined (UD) binary predicate mod_lesser
inplace_merge ( v3.begin( ), break3, v3.end( ), mod_lesser );
cout << "Merged inplace with binary predicate mod_lesser specified,\n "
<< "vector v3mod = ( " ; ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")" << endl;
}
Original vector v1 with subranges sorted by the
binary predicate less than is v1 = ( 0 1 2 3 4 5 -5 -4 -3 -2 -1 0 )
Original vector v2 with subranges sorted by the
binary predicate greater is v2 = ( 5 4 3 2 1 0 0 -1 -2 -3 -4 -5 )
Original vector v3 with subranges sorted by the
binary predicate mod_lesser is v3 = ( 0 1 2 3 4 5 0 -1 -2 -3 -4 -5 )
Merged inplace with default order,
vector v1mod = ( -5 -4 -3 -2 -1 0 0 1 2 3 4 5 )
Merged inplace with binary predicate greater specified,
vector v2mod = ( 5 4 3 2 1 0 0 -1 -2 -3 -4 -5 )
Merged inplace with binary predicate mod_lesser specified,
vector v3mod = ( 0 0 1 -1 2 -2 3 -3 4 -4 5 -5 )
is_heap
Retorna true se os elementos no intervalo especificado formarem uma pilha.
template<class RandomAccessIterator>
bool is_heap(
RandomAccessIterator first,
RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
bool is_heap(
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
template<class ExecutionPolicy, class RandomAccessIterator>
bool is_heap(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last);
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
bool is_heap(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de acesso aleatório que indica o início de um intervalo para verificar se há um heap.
last
Um iterador de acesso aleatório que indica o fim de um intervalo.
pred
Uma condição para testar para ordenar elementos. Um predicado de comparação usa dois argumentos e retorna true ou false.
Valor de retorno
Retorna true se os elementos no intervalo especificado formarem uma pilha, false se não formarem.
Observações
A primeira função de modelo retorna is_heap_until(first , last) == last.
A segunda função de modelo retorna
is_heap_until(first, last, pred) == last.
is_heap_until
Retorna um iterador posicionado no primeiro elemento do intervalo [ first, last) que não satisfaz a condição de ordem de heap, ou end se o intervalo forma um heap.
template<class RandomAccessIterator>
RandomAccessIterator is_heap_until(
RandomAccessIterator first,
RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
RandomAccessIterator is_heap_until(
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
template<class ExecutionPolicy, class RandomAccessIterator>
RandomAccessIterator is_heap_until(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last);
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
RandomAccessIterator is_heap_until(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de acesso aleatório que especifica o primeiro elemento de um intervalo para verificar se há um heap.
last
Um iterador de acesso aleatório que especifica o final do intervalo para verificar se há um heap.
pred
Um predicado binário que especifica a condição de ordenação fraca estrita que define um heap. O predicado padrão é std::less<> quando pred não é especificado.
Valor de retorno
Retorna last se o intervalo especificado formar uma pilha ou contiver um ou menos elementos. Caso contrário, retorna um iterador para o primeiro elemento encontrado que não satisfaz a condição de pilha.
Observações
A primeira função de modelo retorna o último iterador next em [first, last) que [first, next) é um heap ordenado pelo objeto std::less<>de função . Se a distância last - first for menor que 2, a função retornará last.
A segunda função de modelo se comporta da mesma forma que a primeira, exceto que ela usa o predicado pred em vez de como a condição de ordenação de std::less<> pilha.
is_partitioned
Retorna true se todos os elementos no intervalo determinado que testam true uma condição vêm antes de quaisquer elementos que testam false.
template<class InputIterator, class UnaryPredicate>
bool is_partitioned(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template <class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
bool is_partitioned(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que indica onde um intervalo começa a verificar uma condição.
last
Um iterador de entrada que indica o fim de um intervalo.
pred
A condição para testar. Esse teste é fornecido por um objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita pelo elemento que está sendo pesquisado. Um predicado unário pega um único argumento e retorna true ou false.
Valor de retorno
Retorna true quando todos os elementos no intervalo determinado que testam true uma condição vêm antes de quaisquer elementos que testam falsee, caso contrário, retornam false.
Observações
A função de modelo retorna true somente se todos os elementos em [first, last) são particionados por pred; ou seja, todos os elementos X em [first, last) que pred (X) é verdadeiro ocorrem antes de todos os elementos Y para os quais pred (Y) é false.
is_permutation
Retorna true se ambos os intervalos contiverem os mesmos elementos, independentemente de os elementos estarem ou não na mesma ordem. Use as sobrecargas de intervalo duplo no código C++14 porque as sobrecargas que levam apenas um único iterador para o segundo intervalo não detetarão diferenças se o segundo intervalo for maior do que o primeiro intervalo. Essas sobrecargas resultarão em comportamento indefinido se o segundo intervalo for menor do que o primeiro.
template<class ForwardIterator1, class ForwardIterator2>
bool is_permutation(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2);
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
bool is_permutation(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
BinaryPredicate Pred);
// C++14
template<class ForwardIterator1, class ForwardIterator2>
bool is_permutation(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
bool is_permutation(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
Parâmetros
first1
Um iterador de encaminhamento que se refere ao primeiro elemento do intervalo.
last1
Um iterador de encaminhamento que se refere a um passado do último elemento do intervalo.
first2
Um iterador de encaminhamento que se refere ao primeiro elemento de um segundo intervalo, usado para comparação.
last2
Um iterador de encaminhamento que se refere a um passado o último elemento de um segundo intervalo, usado para comparação.
pred
Um predicado que testa a equivalência e retorna um bool.
Valor de retorno
true quando os intervalos podem ser reorganizados de modo a serem idênticos de acordo com o predicado comparador; caso contrário, false.
Observações
is_permutation tem complexidade quadrática na pior das hipóteses.
A primeira função de modelo assume que há tantos elementos no intervalo que começa em first2 quanto há no intervalo designado por [first1, last1). Se houver mais elementos no segundo intervalo, eles serão ignorados; se houver menos, ocorrerá um comportamento indefinido. A terceira função de modelo (C++14 e posterior) não faz essa suposição. Ambos retornam true somente se, para cada elemento X no intervalo designado por [first1, last1) existirem tantos elementos Y no mesmo intervalo para o qual X == Y existem no intervalo que começa em first2 ou [first2, last2). Aqui, operator== deve realizar uma comparação par entre seus operandos.
A segunda e quarta funções de modelo se comportam da mesma forma, exceto que elas substituem operator==(X, Y) por Pred(X, Y). Para se comportar corretamente, o predicado deve ser simétrico, reflexivo e transitivo.
Exemplo
O exemplo a seguir mostra como usar is_permutation:
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
vector<int> vec_1{ 2, 3, 0, 1, 4, 5 };
vector<int> vec_2{ 5, 4, 0, 3, 1, 2 };
vector<int> vec_3{ 4, 9, 13, 3, 6, 5 };
vector<int> vec_4{ 7, 4, 11, 9, 2, 1 };
cout << "(1) Compare using built-in == operator: ";
cout << boolalpha << is_permutation(vec_1.begin(), vec_1.end(),
vec_2.begin(), vec_2.end()) << endl; // true
cout << "(2) Compare after modifying vec_2: ";
vec_2[0] = 6;
cout << is_permutation(vec_1.begin(), vec_1.end(),
vec_2.begin(), vec_2.end()) << endl; // false
// Define equivalence as "both are odd or both are even"
cout << "(3) vec_3 is a permutation of vec_4: ";
cout << is_permutation(vec_3.begin(), vec_3.end(),
vec_4.begin(), vec_4.end(),
[](int lhs, int rhs) { return lhs % 2 == rhs % 2; }) << endl; // true
// Initialize a vector using the 's' string literal to specify a std::string
vector<string> animals_1{ "dog"s, "cat"s, "bird"s, "monkey"s };
vector<string> animals_2{ "donkey"s, "bird"s, "meerkat"s, "cat"s };
// Define equivalence as "first letters are equal":
bool is_perm = is_permutation(animals_1.begin(), animals_1.end(), animals_2.begin(), animals_2.end(),
[](const string& lhs, const string& rhs)
{
return lhs[0] == rhs[0]; //std::string guaranteed to have at least a null terminator
});
cout << "animals_2 is a permutation of animals_1: " << is_perm << endl; // true
return 0;
}
(1) Compare using built-in == operator: true
(2) Compare after modifying vec_2: false
(3) vec_3 is a permutation of vec_4: true
animals_2 is a permutation of animals_1: true
is_sorted
Retorna true se os elementos no intervalo especificado estiverem em ordem classificada.
template<class ForwardIterator>
bool is_sorted(
ForwardIterator first,
ForwardIterator last);
template<class ForwardIterator, class Compare>
bool is_sorted(
ForwardIterator first,
ForwardIterator last,
Compare pred);
template<class ExecutionPolicy, class ForwardIterator>
bool is_sorted(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class Compare>
bool is_sorted(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de encaminhamento que indica onde começa o intervalo a ser verificado.
last
Um iterador de encaminhamento que indica o fim de um intervalo.
pred
A condição a testar para determinar uma ordem entre dois elementos. Um predicado de comparação usa dois argumentos e retorna true ou false. Este predicado executa a mesma tarefa que operator<.
Observações
A primeira função de modelo retorna is_sorted_until( first, last ) == last. A operator< função executa a comparação de ordem.
A segunda função de modelo retorna is_sorted_until( first, last , pred ) == last. A pred função de predicado executa a comparação de ordem.
is_sorted_until
Retorna um ForwardIterator que está definido como o último elemento que está em ordem classificada de um intervalo especificado.
A segunda versão permite fornecer um objeto de função de comparação que retorna true quando dois elementos determinados estão em ordem ordenada e false caso contrário.
template<class ForwardIterator>
ForwardIterator is_sorted_until(
ForwardIterator first,
ForwardIterator last);
template<class ForwardIterator, class Compare>
ForwardIterator is_sorted_until(
ForwardIterator first,
ForwardIterator last,
Compare pred);
template<class ExecutionPolicy, class ForwardIterator>
ForwardIterator is_sorted_until(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class Compare>
ForwardIterator is_sorted_until(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de encaminhamento que indica onde o intervalo a ser verificado começa.
last
Um iterador de encaminhamento que indica o fim de um intervalo.
pred
A condição a testar para determinar uma ordem entre dois elementos. Um predicado de comparação usa dois argumentos e retorna true ou false.
Valor de retorno
Retorna um ForwardIterator conjunto para o último elemento em ordem classificada. A sequência ordenada começa em first.
Observações
A primeira função de modelo retorna o último iterador next para [first, last] que [first, next) seja uma sequência ordenada por operator<. Se distance() for menor que 2, a função retornará last.
A segunda função de modelo se comporta da mesma forma, exceto que substitui operator<(X, Y) por pred(X, Y).
iter_swap
Troca dois valores referidos por um par de iteradores especificados.
template<class ForwardIterator1, class ForwardIterator2>
void iter_swap( ForwardIterator1 left, ForwardIterator2 right );
Parâmetros
left
Um dos iteradores forward cujo valor deve ser trocado.
right
O segundo dos iteradores a prazo cujo valor deve ser trocado.
Observações
swap deve ser usado em preferência ao iter_swap, que foi incluído no padrão C++ para compatibilidade com versões anteriores. Se Fit1 e Fit2 são iteradores de encaminhamento, então iter_swap( Fit1, Fit2 ), é equivalente a swap( *Fit1, *Fit2 ).
Os tipos de valor dos iteradores de encaminhamento de entrada devem ter o mesmo valor.
Exemplo
// alg_iter_swap.cpp
// compile with: /EHsc
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
{
public:
CInt( int n = 0 ) : m_nVal( n ){}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ){}
CInt& operator=( const CInt& rhs ) { m_nVal =
rhs.m_nVal; return *this; }
bool operator<( const CInt& rhs ) const
{ return ( m_nVal < rhs.m_nVal );}
friend ostream& operator<<( ostream& osIn, const CInt& rhs );
private:
int m_nVal;
};
inline ostream& operator<<( ostream& osIn, const CInt& rhs )
{
osIn << "CInt(" << rhs.m_nVal << ")";
return osIn;
}
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
};
int main()
{
CInt c1 = 5, c2 = 1, c3 = 10;
deque<CInt> deq1;
deque<CInt>::iterator d1_Iter;
deq1.push_back ( c1 );
deq1.push_back ( c2 );
deq1.push_back ( c3 );
cout << "The original deque of CInts is deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl;
// Exchanging first and last elements with iter_swap
iter_swap ( deq1.begin( ), --deq1.end( ) );
cout << "The deque of CInts with first & last elements swapped is:\n deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl;
// Swapping back first and last elements with swap
swap ( *deq1.begin( ), *(deq1.end( ) -1 ) );
cout << "The deque of CInts with first & last elements swapped back is:\n deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl;
// Swapping a vector element with a deque element
vector<int> v1;
vector<int>::iterator Iter1;
deque<int> deq2;
deque<int>::iterator d2_Iter;
int i;
for ( i = 0 ; i <= 3 ; i++ )
{
v1.push_back( i );
}
int ii;
for ( ii = 4 ; ii <= 5 ; ii++ )
{
deq2.push_back( ii );
}
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Deque deq2 is ( " ;
for ( d2_Iter = deq2.begin( ) ; d2_Iter != deq2.end( ) ; d2_Iter++ )
cout << *d2_Iter << " ";
cout << ")." << endl;
iter_swap ( v1.begin( ), deq2.begin( ) );
cout << "After exchanging first elements,\n vector v1 is: v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl << " & deque deq2 is: deq2 = ( ";
for ( d2_Iter = deq2.begin( ) ; d2_Iter != deq2.end( ) ; d2_Iter++ )
cout << *d2_Iter << " ";
cout << ")." << endl;
}
The original deque of CInts is deq1 = ( CInt(5), CInt(1), CInt(10) ).
The deque of CInts with first & last elements swapped is:
deq1 = ( CInt(10), CInt(1), CInt(5) ).
The deque of CInts with first & last elements swapped back is:
deq1 = ( CInt(5), CInt(1), CInt(10) ).
Vector v1 is ( 0 1 2 3 ).
Deque deq2 is ( 4 5 ).
After exchanging first elements,
vector v1 is: v1 = ( 4 1 2 3 ).
& deque deq2 is: deq2 = ( 0 5 ).
lexicographical_compare
Compara elemento por elemento entre duas sequências para determinar qual é a menor das duas.
template<class InputIterator1, class InputIterator2>
bool lexicographical_compare(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2 );
template<class InputIterator1, class InputIterator2, class Compare>
bool lexicographical_compare(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
Compare pred );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
bool lexicographical_compare(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class Compare>
bool lexicographical_compare(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador de entrada que aborda a posição do primeiro elemento no primeiro intervalo a ser comparado.
last1
Um iterador de entrada abordando a posição um após o elemento final no primeiro intervalo a ser comparado.
first2
Um iterador de entrada abordando a posição do primeiro elemento no segundo intervalo a ser comparado.
last2
Um iterador de entrada abordando a posição um após o elemento final no segundo intervalo a ser comparado.
pred
Objeto de função de predicado definido pelo usuário que define o sentido no qual um elemento é menor que outro. Um predicado de comparação usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
true se o primeiro intervalo for lexicograficamente inferior ao segundo; caso contrário false.
Observações
Uma comparação lexicográfica entre sequências compara-as elemento a elemento até:
Ele encontra dois elementos correspondentes desiguais, e o resultado de sua comparação é tomado como o resultado da comparação entre sequências.
Não são encontradas desigualdades, mas uma sequência tem mais elementos do que a outra, e a sequência mais curta é considerada menor do que a sequência mais longa.
Nenhuma desigualdade é encontrada e as sequências têm o mesmo número de elementos, e assim as sequências são iguais e o resultado da comparação é
false.
Exemplo
// alg_lex_comp.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
// Return whether second element is twice the first
bool twice ( int elem1, int elem2 )
{
return 2 * elem1 < elem2;
}
int main()
{
using namespace std;
vector<int> v1, v2;
list<int> L1;
vector<int>::iterator Iter1, Iter2;
list<int>::iterator L1_Iter, L1_inIter;
int i;
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 5 * i );
}
int ii;
for ( ii = 0 ; ii <= 6 ; ii++ )
{
L1.push_back( 5 * ii );
}
int iii;
for ( iii = 0 ; iii <= 5 ; iii++ )
{
v2.push_back( 10 * iii );
}
cout << "Vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "List L1 = ( " ;
for ( L1_Iter = L1.begin( ) ; L1_Iter!= L1.end( ) ; L1_Iter++ )
cout << *L1_Iter << " ";
cout << ")" << endl;
cout << "Vector v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// Self lexicographical_comparison of v1 under identity
bool result1;
result1 = lexicographical_compare (v1.begin( ), v1.end( ),
v1.begin( ), v1.end( ) );
if ( result1 )
cout << "Vector v1 is lexicographically_less than v1." << endl;
else
cout << "Vector v1 is not lexicographically_less than v1." << endl;
// lexicographical_comparison of v1 and L2 under identity
bool result2;
result2 = lexicographical_compare (v1.begin( ), v1.end( ),
L1.begin( ), L1.end( ) );
if ( result2 )
cout << "Vector v1 is lexicographically_less than L1." << endl;
else
cout << "Vector v1 is lexicographically_less than L1." << endl;
bool result3;
result3 = lexicographical_compare (v1.begin( ), v1.end( ),
v2.begin( ), v2.end( ), twice );
if ( result3 )
cout << "Vector v1 is lexicographically_less than v2 "
<< "under twice." << endl;
else
cout << "Vector v1 is not lexicographically_less than v2 "
<< "under twice." << endl;
}
Vector v1 = ( 0 5 10 15 20 25 )
List L1 = ( 0 5 10 15 20 25 30 )
Vector v2 = ( 0 10 20 30 40 50 )
Vector v1 is not lexicographically_less than v1.
Vector v1 is lexicographically_less than L1.
Vector v1 is not lexicographically_less than v2 under twice.
lower_bound
Localiza a posição do primeiro elemento em um intervalo ordenado que tem um valor maior ou equivalente a um valor especificado. O critério de ordenação pode ser especificado por um predicado binário.
template<class ForwardIterator, class Type>
ForwardIterator lower_bound(
ForwardIterator first,
ForwardIterator last,
const Type& value );
template<class ForwardIterator, class Type, class BinaryPredicate>
ForwardIterator lower_bound(
ForwardIterator first,
ForwardIterator last,
const Type& value,
BinaryPredicate pred );
Parâmetros
first
Um iterador avançado que aborda a posição do primeiro elemento no intervalo a ser pesquisado.
last
Um iterador avançado abordando a posição um após o elemento final no intervalo a ser pesquisado.
value
O valor cuja primeira posição ou possível primeira posição está sendo pesquisada no intervalo ordenado.
pred
Objeto de função de predicado definido pelo usuário que define o sentido no qual um elemento é menor que outro. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
Um iterador de encaminhamento na posição do primeiro elemento em um intervalo ordenado com um valor maior ou equivalente a um valor especificado. A equivalência pode ser especificada com um predicado binário.
Observações
O intervalo de origem classificado referenciado deve ser válido; Todos os iteradores devem ser desreferenciados e, dentro da sequência, a última posição deve ser alcançável a partir da primeira por incremento.
Um intervalo classificado é uma pré-condição de uso lower_bound e onde a ordem é a mesma especificada por com predicado binário.
O intervalo não é modificado pelo algoritmo lower_bound.
Os tipos de valor dos iteradores de encaminhamento devem ser menores do que comparáveis para serem encomendados. Ou seja, dados dois elementos, você pode determinar que um é menor que o outro, ou que eles são equivalentes. (Aqui, equivalente significa que nenhum é menor que o outro.) Esta comparação resulta numa ordenação entre os elementos não equivalentes.
A complexidade do algoritmo é logarítmica para iteradores de acesso aleatório e linear de outra forma, com o número de passos proporcional a (last - first).
Exemplo
// alg_lower_bound.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
}
int main()
{
using namespace std;
vector<int> v1;
// Constructing vector v1 with default less-than ordering
for ( auto i = -1 ; i <= 4 ; ++i )
{
v1.push_back( i );
}
for ( auto ii =-3 ; ii <= 0 ; ++ii )
{
v1.push_back( ii );
}
cout << "Starting vector v1 = ( " ;
for (const auto &Iter : v1)
cout << Iter << " ";
cout << ")." << endl;
sort(v1.begin(), v1.end());
cout << "Original vector v1 with range sorted by the\n "
<< "binary predicate less than is v1 = ( " ;
for (const auto &Iter : v1)
cout << Iter << " ";
cout << ")." << endl;
// Constructing vector v2 with range sorted by greater
vector<int> v2(v1);
sort(v2.begin(), v2.end(), greater<int>());
cout << "Original vector v2 with range sorted by the\n "
<< "binary predicate greater is v2 = ( " ;
for (const auto &Iter : v2)
cout << Iter << " ";
cout << ")." << endl;
// Constructing vectors v3 with range sorted by mod_lesser
vector<int> v3(v1);
sort(v3.begin(), v3.end(), mod_lesser);
cout << "Original vector v3 with range sorted by the\n "
<< "binary predicate mod_lesser is v3 = ( " ;
for (const auto &Iter : v3)
cout << Iter << " ";
cout << ")." << endl;
// Demonstrate lower_bound
vector<int>::iterator Result;
// lower_bound of 3 in v1 with default binary predicate less<int>()
Result = lower_bound(v1.begin(), v1.end(), 3);
cout << "The lower_bound in v1 for the element with a value of 3 is: "
<< *Result << "." << endl;
// lower_bound of 3 in v2 with the binary predicate greater<int>( )
Result = lower_bound(v2.begin(), v2.end(), 3, greater<int>());
cout << "The lower_bound in v2 for the element with a value of 3 is: "
<< *Result << "." << endl;
// lower_bound of 3 in v3 with the binary predicate mod_lesser
Result = lower_bound(v3.begin(), v3.end(), 3, mod_lesser);
cout << "The lower_bound in v3 for the element with a value of 3 is: "
<< *Result << "." << endl;
}
Starting vector v1 = ( -1 0 1 2 3 4 -3 -2 -1 0 ).
Original vector v1 with range sorted by the
binary predicate less than is v1 = ( -3 -2 -1 -1 0 0 1 2 3 4 ).
Original vector v2 with range sorted by the
binary predicate greater is v2 = ( 4 3 2 1 0 0 -1 -1 -2 -3 ).
Original vector v3 with range sorted by the
binary predicate mod_lesser is v3 = ( 0 0 -1 -1 1 -2 2 -3 3 4 ).
The lower_bound in v1 for the element with a value of 3 is: 3.
The lower_bound in v2 for the element with a value of 3 is: 3.
The lower_bound in v3 for the element with a value of 3 is: -3.
make_heap
Converte elementos de um intervalo especificado em um heap no qual o primeiro elemento é o maior e para o qual um critério de classificação pode ser especificado com um predicado binário.
template<class RandomAccessIterator>
void make_heap(
RandomAccessIterator first,
RandomAccessIterator last );
template<class RandomAccessIterator, class BinaryPredicate>
void make_heap(
RandomAccessIterator first,
RandomAccessIterator last,
BinaryPredicate pred );
Parâmetros
first
Um iterador de acesso aleatório que aborda a posição do primeiro elemento no intervalo a ser convertido em uma pilha.
last
Um iterador de acesso aleatório abordando a posição um após o elemento final no intervalo a ser convertido em um heap.
pred
Objeto de função de predicado definido pelo usuário que define o sentido no qual um elemento é menor que outro. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Observações
As pilhas têm duas propriedades:
O primeiro elemento é sempre o maior.
Os elementos podem ser adicionados ou removidos em tempo logarítmico.
Os heaps são uma maneira ideal de implementar filas de prioridade e são usados na implementação do adaptador de contêiner C++ Standard Library priority_queue Class.
A complexidade é linear, exigindo 3 * (last - first) comparações.
Exemplo
// alg_make_heap.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
int main() {
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1, Iter2;
int i;
for ( i = 0 ; i <= 9 ; i++ )
v1.push_back( i );
random_shuffle( v1.begin( ), v1.end( ) );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Make v1 a heap with default less than ordering
make_heap ( v1.begin( ), v1.end( ) );
cout << "The heaped version of vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Make v1 a heap with greater than ordering
make_heap ( v1.begin( ), v1.end( ), greater<int>( ) );
cout << "The greater-than heaped version of v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
}
Vector v1 is ( 4 3 7 8 0 5 2 1 6 9 ).
The heaped version of vector v1 is ( 9 8 7 6 3 5 2 1 4 0 ).
The greater-than heaped version of v1 is ( 0 1 2 4 3 5 7 6 9 8 ).
max
Compara dois objetos e retorna o maior dos dois, onde o critério de ordenação pode ser especificado por um predicado binário.
template<class Type>
constexpr Type& max(
const Type& left,
const Type& right);
template<class Type, class Pr>
constexpr Type& max(
const Type& left,
const Type& right,
BinaryPredicate pred);
template<class Type>
constexpr Type& max (
initializer_list<Type> ilist);
template<class Type, class Pr>
constexpr Type& max(
initializer_list<Type> ilist,
BinaryPredicate pred);
Parâmetros
left
O primeiro dos dois objetos que estão sendo comparados.
right
O segundo dos dois objetos que estão sendo comparados.
pred
Um predicado binário usado para comparar os dois objetos.
inlist
A lista de inicializadores que contém os objetos a serem comparados.
Valor de retorno
O maior dos dois objetos, a menos que nenhum seja maior; nesse caso, ele retorna o primeiro dos dois objetos. Quando um initializer_list é especificado, ele retorna o maior dos objetos na lista.
Observações
O max algoritmo é incomum em ter objetos passados como parâmetros. A maioria dos algoritmos C++ Standard Library operam em uma gama de elementos cuja posição é especificada por iteradores passados como parâmetros. Se você precisar de uma função que opere em uma variedade de elementos, use max_element em vez disso. Visual Studio 2017 habilita constexpr nas sobrecargas que levam um initializer_listarquivo .
Exemplo
// alg_max.cpp
// compile with: /EHsc
#include <vector>
#include <set>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
{
public:
CInt( int n = 0 ) : m_nVal( n ){}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ){}
CInt& operator=( const CInt& rhs ) {m_nVal =
rhs.m_nVal; return *this;}
bool operator<( const CInt& rhs ) const
{return ( m_nVal < rhs.m_nVal );}
friend ostream& operator<<( ostream& osIn, const CInt& rhs );
private:
int m_nVal;
};
inline ostream& operator<<( ostream& osIn, const CInt& rhs )
{
osIn << "CInt( " << rhs.m_nVal << " )";
return osIn;
}
// Return whether absolute value of elem1 is greater than
// absolute value of elem2
bool abs_greater ( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = -elem1;
if ( elem2 < 0 )
elem2 = -elem2;
return elem1 < elem2;
};
int main()
{
int a = 6, b = -7;
// Return the integer with the larger absolute value
const int& result1 = max(a, b, abs_greater);
// Return the larger integer
const int& result2 = max(a, b);
cout << "Using integers 6 and -7..." << endl;
cout << "The integer with the greater absolute value is: "
<< result1 << "." << endl;
cout << "The integer with the greater value is: "
<< result2 << "." << endl;
cout << endl;
// Comparing the members of an initializer_list
const int& result3 = max({ a, b });
const int& result4 = max({ a, b }, abs_greater);
cout << "Comparing the members of an initializer_list..." << endl;
cout << "The member with the greater value is: " << result3 << endl;
cout << "The integer with the greater absolute value is: " << result4 << endl;
// Comparing set containers with elements of type CInt
// using the max algorithm
CInt c1 = 1, c2 = 2, c3 = 3;
set<CInt> s1, s2, s3;
set<CInt>::iterator s1_Iter, s2_Iter, s3_Iter;
s1.insert ( c1 );
s1.insert ( c2 );
s2.insert ( c2 );
s2.insert ( c3 );
cout << "s1 = (";
for ( s1_Iter = s1.begin( ); s1_Iter != --s1.end( ); s1_Iter++ )
cout << " " << *s1_Iter << ",";
s1_Iter = --s1.end( );
cout << " " << *s1_Iter << " )." << endl;
cout << "s2 = (";
for ( s2_Iter = s2.begin( ); s2_Iter != --s2.end( ); s2_Iter++ )
cout << " " << *s2_Iter << ",";
s2_Iter = --s2.end( );
cout << " " << *s2_Iter << " )." << endl;
s3 = max ( s1, s2 );
cout << "s3 = max ( s1, s2 ) = (";
for ( s3_Iter = s3.begin( ); s3_Iter != --s3.end( ); s3_Iter++ )
cout << " " << *s3_Iter << ",";
s3_Iter = --s3.end( );
cout << " " << *s3_Iter << " )." << endl << endl;
// Comparing vectors with integer elements using the max algorithm
vector<int> v1, v2, v3, v4, v5;
vector<int>::iterator Iter1, Iter2, Iter3, Iter4, Iter5;
int i;
for ( i = 0 ; i <= 2 ; i++ )
{
v1.push_back( i );
}
int ii;
for ( ii = 0 ; ii <= 2 ; ii++ )
{
v2.push_back( ii );
}
int iii;
for ( iii = 0 ; iii <= 2 ; iii++ )
{
v3.push_back( 2 * iii );
}
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Vector v2 is ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
cout << "Vector v3 is ( " ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
v4 = max ( v1, v2 );
v5 = max ( v1, v3 );
cout << "Vector v4 = max (v1,v2) is ( " ;
for ( Iter4 = v4.begin( ) ; Iter4 != v4.end( ) ; Iter4++ )
cout << *Iter4 << " ";
cout << ")." << endl;
cout << "Vector v5 = max (v1,v3) is ( " ;
for ( Iter5 = v5.begin( ) ; Iter5 != v5.end( ) ; Iter5++ )
cout << *Iter5 << " ";
cout << ")." << endl;
}
Using integers 6 and -7...
The integer with the greater absolute value is: -7
The integer with the greater value is: 6.
Comparing the members of an initializer_list...
The member with the greater value is: 6
The integer with the greater absolute value is: -7
s1 = ( CInt( 1 ), CInt( 2 ) ).
s2 = ( CInt( 2 ), CInt( 3 ) ).
s3 = max ( s1, s2 ) = ( CInt( 2 ), CInt( 3 ) ).
Vector v1 is ( 0 1 2 ).
Vector v2 is ( 0 1 2 ).
Vector v3 is ( 0 2 4 ).
Vector v4 = max (v1,v2) is ( 0 1 2 ).
Vector v5 = max (v1,v3) is ( 0 2 4 ).
max_element
Localiza a primeira ocorrência do maior elemento em um intervalo especificado onde o critério de ordenação pode ser especificado por um predicado binário.
template<class ForwardIterator>
constexpr ForwardIterator max_element(
ForwardIterator first,
ForwardIterator last );
template<class ForwardIterator, class Compare>
constexpr ForwardIterator max_element(
ForwardIterator first,
ForwardIterator last,
Compare pred );
template<class ExecutionPolicy, class ForwardIterator>
ForwardIterator max_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class Compare>
ForwardIterator max_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de encaminhamento abordando a posição do primeiro elemento no intervalo a ser pesquisado para o elemento maior.
last
Um iterador avançado que aborda a posição um após o elemento final no intervalo a ser pesquisado para o elemento maior.
pred
Objeto de função de predicado definido pelo usuário que define o sentido em que um elemento é menor que outro. O predicado de comparação usa dois argumentos e deve retornar true quando o primeiro elemento é menor que o segundo elemento e false caso contrário.
Valor de retorno
Um iterador avançado que aborda a posição da primeira ocorrência do maior elemento no intervalo pesquisado.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição é alcançável a partir da primeira por incremento.
A complexidade é linear: (last - first) - 1 são necessárias comparações para um intervalo não vazio.
Exemplo
// alg_max_element.cpp
// compile with: /EHsc
#include <vector>
#include <set>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
{
public:
CInt( int n = 0 ) : m_nVal( n ){}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ){}
CInt& operator=( const CInt& rhs ) {m_nVal =
rhs.m_nVal; return *this;}
bool operator<( const CInt& rhs ) const
{return ( m_nVal < rhs.m_nVal );}
friend ostream& operator<<( ostream& osIn, const CInt& rhs );
private:
int m_nVal;
};
inline ostream& operator<<(ostream& osIn, const CInt& rhs)
{
osIn << "CInt( " << rhs.m_nVal << " )";
return osIn;
}
// Return whether modulus of elem1 is greater than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
};
int main()
{
// Searching a set container with elements of type CInt
// for the maximum element
CInt c1 = 1, c2 = 2, c3 = -3;
set<CInt> s1;
set<CInt>::iterator s1_Iter, s1_R1_Iter, s1_R2_Iter;
s1.insert ( c1 );
s1.insert ( c2 );
s1.insert ( c3 );
cout << "s1 = (";
for ( s1_Iter = s1.begin( ); s1_Iter != --s1.end( ); s1_Iter++ )
cout << " " << *s1_Iter << ",";
s1_Iter = --s1.end( );
cout << " " << *s1_Iter << " )." << endl;
s1_R1_Iter = max_element ( s1.begin( ), s1.end( ) );
cout << "The largest element in s1 is: " << *s1_R1_Iter << endl;
cout << endl;
// Searching a vector with elements of type int for the maximum
// element under default less than & mod_lesser binary predicates
vector<int> v1;
vector<int>::iterator v1_Iter, v1_R1_Iter, v1_R2_Iter;
int i;
for ( i = 0 ; i <= 3 ; i++ )
{
v1.push_back( i );
}
int ii;
for ( ii = 1 ; ii <= 4 ; ii++ )
{
v1.push_back( - 2 * ii );
}
cout << "Vector v1 is ( " ;
for ( v1_Iter = v1.begin( ) ; v1_Iter != v1.end( ) ; v1_Iter++ )
cout << *v1_Iter << " ";
cout << ")." << endl;
v1_R1_Iter = max_element ( v1.begin( ), v1.end( ) );
v1_R2_Iter = max_element ( v1.begin( ), v1.end( ), mod_lesser);
cout << "The largest element in v1 is: " << *v1_R1_Iter << endl;
cout << "The largest element in v1 under the mod_lesser"
<< "\n binary predicate is: " << *v1_R2_Iter << endl;
}
s1 = ( CInt( -3 ), CInt( 1 ), CInt( 2 ) ).
The largest element in s1 is: CInt( 2 )
Vector v1 is ( 0 1 2 3 -2 -4 -6 -8 ).
The largest element in v1 is: 3
The largest element in v1 under the mod_lesser
binary predicate is: -8
merge
Combina todos os elementos de dois intervalos de origem classificados em um único intervalo de destino classificado, onde o critério de ordenação pode ser especificado por um predicado binário.
template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result );
template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator merge(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result,
Compare pred );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator>
ForwardIterator merge(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator, class Compare>
ForwardIterator merge(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador de entrada que aborda a posição do primeiro elemento no primeiro de dois intervalos de origem classificados a serem combinados e classificados em um único intervalo.
last1
Um iterador de entrada que aborda a posição um após o último elemento no primeiro de dois intervalos de origem classificados a serem combinados e classificados em um único intervalo.
first2
Um iterador de entrada que aborda a posição do primeiro elemento no segundo de dois intervalos de origem classificados consecutivos a serem combinados e classificados em um único intervalo.
last2
Um iterador de entrada que aborda a posição um após o último elemento no segundo de dois intervalos de origem classificados consecutivos a serem combinados e classificados em um único intervalo.
result
Um iterador de saída que aborda a posição do primeiro elemento no intervalo de destino onde os dois intervalos de origem devem ser combinados em um único intervalo classificado.
pred
Objeto de função de predicado definido pelo usuário que define o sentido em que um elemento é menor que outro. O predicado de comparação usa dois argumentos e deve retornar true quando o primeiro elemento é menor que o segundo elemento, e false caso contrário.
Valor de retorno
Um iterador de saída endereçando a posição um após o último elemento no intervalo de destino classificado.
Observações
Os intervalos de origem classificados referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição deve ser alcançável a partir da primeira por incremento.
O intervalo de destino não deve sobrepor-se a nenhum dos intervalos de origem e deve ser grande o suficiente para conter o intervalo de destino.
Os intervalos de fontes ordenadas devem ser organizados como uma pré-condição para a aplicação do merge algoritmo de acordo com a mesma ordenação que deve ser usada pelo algoritmo para classificar os intervalos combinados.
A operação é estável à medida que a ordem relativa dos elementos dentro de cada intervalo é preservada no intervalo de destino. Os intervalos de origem não são modificados pelo algoritmo merge.
Os tipos de valor dos iteradores de entrada devem ser menores do que comparáveis para serem encomendados. Ou seja, dados dois elementos, você pode determinar que um é menor que o outro, ou que eles são equivalentes. (Aqui, equivalente significa que nenhum é menor que o outro.) Esta comparação resulta numa ordenação entre os elementos não equivalentes. Quando há elementos equivalentes em ambos os intervalos de origem, os elementos no primeiro intervalo precedem os elementos do segundo intervalo de origem no intervalo de destino.
A complexidade do algoritmo é linear com, no máximo (last1 - first1) - (last2 - first2) - 1 , comparações.
A list classe fornece uma função merge de membro para mesclar os elementos de duas listas.
Exemplo
// alg_merge.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 ) {
if (elem1 < 0)
elem1 = - elem1;
if (elem2 < 0)
elem2 = - elem2;
return elem1 < elem2;
}
int main() {
using namespace std;
vector<int> v1a, v1b, v1 ( 12 );
vector<int>::iterator Iter1a, Iter1b, Iter1;
// Constructing vector v1a and v1b with default less than ordering
int i;
for ( i = 0 ; i <= 5 ; i++ )
v1a.push_back( i );
int ii;
for ( ii =-5 ; ii <= 0 ; ii++ )
v1b.push_back( ii );
cout << "Original vector v1a with range sorted by the\n "
<< "binary predicate less than is v1a = ( " ;
for ( Iter1a = v1a.begin( ) ; Iter1a != v1a.end( ) ; Iter1a++ )
cout << *Iter1a << " ";
cout << ")." << endl;
cout << "Original vector v1b with range sorted by the\n "
<< "binary predicate less than is v1b = ( " ;
for ( Iter1b = v1b.begin( ) ; Iter1b != v1b.end( ) ; Iter1b++ )
cout << *Iter1b << " ";
cout << ")." << endl;
// Constructing vector v2 with ranges sorted by greater
vector<int> v2a ( v1a ) , v2b ( v1b ) , v2 ( v1 );
vector<int>::iterator Iter2a, Iter2b, Iter2;
sort ( v2a.begin( ), v2a.end( ), greater<int>( ) );
sort ( v2b.begin( ), v2b.end( ), greater<int>( ) );
cout << "Original vector v2a with range sorted by the\n "
<< "binary predicate greater is v2a = ( " ;
for ( Iter2a = v2a.begin( ) ; Iter2a != v2a.end( ) ; Iter2a++ )
cout << *Iter2a << " ";
cout << ")." << endl;
cout << "Original vector v2b with range sorted by the\n "
<< "binary predicate greater is v2b = ( " ;
for ( Iter2b = v2b.begin( ) ; Iter2b != v2b.end( ) ; Iter2b++ )
cout << *Iter2b << " ";
cout << ")." << endl;
// Constructing vector v3 with ranges sorted by mod_lesser
vector<int> v3a( v1a ), v3b( v1b ) , v3( v1 );
vector<int>::iterator Iter3a, Iter3b, Iter3;
sort ( v3a.begin( ), v3a.end( ), mod_lesser );
sort ( v3b.begin( ), v3b.end( ), mod_lesser );
cout << "Original vector v3a with range sorted by the\n "
<< "binary predicate mod_lesser is v3a = ( " ;
for ( Iter3a = v3a.begin( ) ; Iter3a != v3a.end( ) ; Iter3a++ )
cout << *Iter3a << " ";
cout << ")." << endl;
cout << "Original vector v3b with range sorted by the\n "
<< "binary predicate mod_lesser is v3b = ( " ;
for ( Iter3b = v3b.begin( ) ; Iter3b != v3b.end( ) ; Iter3b++ )
cout << *Iter3b << " ";
cout << ")." << endl;
// To merge inplace in ascending order with default binary
// predicate less<int>( )
merge ( v1a.begin( ), v1a.end( ), v1b.begin( ), v1b.end( ), v1.begin( ) );
cout << "Merged inplace with default order,\n vector v1mod = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// To merge inplace in descending order, specify binary
// predicate greater<int>( )
merge ( v2a.begin( ), v2a.end( ), v2b.begin( ), v2b.end( ),
v2.begin( ), greater<int>( ) );
cout << "Merged inplace with binary predicate greater specified,\n "
<< "vector v2mod = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
// Applying A user-defined (UD) binary predicate mod_lesser
merge ( v3a.begin( ), v3a.end( ), v3b.begin( ), v3b.end( ),
v3.begin( ), mod_lesser );
cout << "Merged inplace with binary predicate mod_lesser specified,\n "
<< "vector v3mod = ( " ; ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
}
Original vector v1a with range sorted by the
binary predicate less than is v1a = ( 0 1 2 3 4 5 ).
Original vector v1b with range sorted by the
binary predicate less than is v1b = ( -5 -4 -3 -2 -1 0 ).
Original vector v2a with range sorted by the
binary predicate greater is v2a = ( 5 4 3 2 1 0 ).
Original vector v2b with range sorted by the
binary predicate greater is v2b = ( 0 -1 -2 -3 -4 -5 ).
Original vector v3a with range sorted by the
binary predicate mod_lesser is v3a = ( 0 1 2 3 4 5 ).
Original vector v3b with range sorted by the
binary predicate mod_lesser is v3b = ( 0 -1 -2 -3 -4 -5 ).
Merged inplace with default order,
vector v1mod = ( -5 -4 -3 -2 -1 0 0 1 2 3 4 5 ).
Merged inplace with binary predicate greater specified,
vector v2mod = ( 5 4 3 2 1 0 0 -1 -2 -3 -4 -5 ).
Merged inplace with binary predicate mod_lesser specified,
vector v3mod = ( 0 0 1 -1 2 -2 3 -3 4 -4 5 -5 ).
min
Compara dois objetos e retorna o menor dos dois, onde o critério de ordenação pode ser especificado por um predicado binário.
template<class Type>
constexpr const Type& min(
const Type& left,
const Type& right);
template<class Type, class Pr>
constexpr const Type& min(
const Type& left,
const Type& right,
BinaryPredicate pred);
template<class Type>
constexpr Type min(
initializer_list<Type> ilist);
template<class Type, class Pr>
constexpr Type min(
initializer_list<Type> ilist,
BinaryPredicate pred);
Parâmetros
left
O primeiro dos dois objetos que estão sendo comparados.
right
O segundo dos dois objetos que estão sendo comparados.
pred
Um predicado binário usado para comparar os dois objetos.
inlist
O initializer_list que contém os membros a serem comparados.
Valor de retorno
O menor dos dois objetos, a menos que nenhum seja menor; nesse caso, ele retorna o primeiro dos dois objetos. Quando um initializer_list é especificado, ele retorna o menor dos objetos na lista.
Observações
O min algoritmo é incomum em ter objetos passados como parâmetros. A maioria dos algoritmos C++ Standard Library operam em uma gama de elementos cuja posição é especificada por iteradores passados como parâmetros. Se você precisar de uma função que use uma variedade de elementos, use min_element.
constexpr foi habilitado initializer_list nas sobrecargas no Visual Studio 2017.
Exemplo
// alg_min.cpp
// compile with: /EHsc
#include <vector>
#include <set>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
{
public:
CInt( int n = 0 ) : m_nVal( n ){}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ){}
CInt& operator=( const CInt& rhs ) {m_nVal =
rhs.m_nVal; return *this;}
bool operator<( const CInt& rhs ) const
{return ( m_nVal < rhs.m_nVal );}
friend ostream& operator<<(ostream& osIn, const CInt& rhs);
private:
int m_nVal;
};
inline ostream& operator<<( ostream& osIn, const CInt& rhs )
{
osIn << "CInt( " << rhs.m_nVal << " )";
return osIn;
}
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
};
int main()
{
// Comparing integers directly using the min algorithm with
// binary predicate mod_lesser & with default less than
int a = 6, b = -7, c = 7 ;
const int& result1 = min ( a, b, mod_lesser );
const int& result2 = min ( b, c );
cout << "The mod_lesser of the integers 6 & -7 is: "
<< result1 << "." << endl;
cout << "The lesser of the integers -7 & 7 is: "
<< result2 << "." << endl;
cout << endl;
// Comparing the members of an initializer_list
const int& result3 = min({ a, c });
const int& result4 = min({ a, b }, mod_lesser);
cout << "The lesser of the integers 6 & 7 is: "
<< result3 << "." << endl;
cout << "The mod_lesser of the integers 6 & -7 is: "
<< result4 << "." << endl;
cout << endl;
// Comparing set containers with elements of type CInt
// using the min algorithm
CInt c1 = 1, c2 = 2, c3 = 3;
set<CInt> s1, s2, s3;
set<CInt>::iterator s1_Iter, s2_Iter, s3_Iter;
s1.insert ( c1 );
s1.insert ( c2 );
s2.insert ( c2 );
s2.insert ( c3 );
cout << "s1 = (";
for ( s1_Iter = s1.begin( ); s1_Iter != --s1.end( ); s1_Iter++ )
cout << " " << *s1_Iter << ",";
s1_Iter = --s1.end( );
cout << " " << *s1_Iter << " )." << endl;
cout << "s2 = (";
for ( s2_Iter = s2.begin( ); s2_Iter != --s2.end( ); s2_Iter++ )
cout << " " << *s2_Iter << ",";
s2_Iter = --s2.end( );
cout << " " << *s2_Iter << " )." << endl;
s3 = min ( s1, s2 );
cout << "s3 = min ( s1, s2 ) = (";
for ( s3_Iter = s3.begin( ); s3_Iter != --s3.end( ); s3_Iter++ )
cout << " " << *s3_Iter << ",";
s3_Iter = --s3.end( );
cout << " " << *s3_Iter << " )." << endl << endl;
// Comparing vectors with integer elements using min algorithm
vector<int> v1, v2, v3, v4, v5;
vector<int>::iterator Iter1, Iter2, Iter3, Iter4, Iter5;
int i;
for ( i = 0 ; i <= 2 ; i++ )
{
v1.push_back( i );
}
int ii;
for ( ii = 0 ; ii <= 2 ; ii++ )
{
v2.push_back( ii );
}
int iii;
for ( iii = 0 ; iii <= 2 ; iii++ )
{
v3.push_back( 2 * iii );
}
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Vector v2 is ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
cout << "Vector v3 is ( " ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
v4 = min ( v1, v2 );
v5 = min ( v1, v3 );
cout << "Vector v4 = min ( v1,v2 ) is ( " ;
for ( Iter4 = v4.begin( ) ; Iter4 != v4.end( ) ; Iter4++ )
cout << *Iter4 << " ";
cout << ")." << endl;
cout << "Vector v5 = min ( v1,v3 ) is ( " ;
for ( Iter5 = v5.begin( ) ; Iter5 != v5.end( ) ; Iter5++ )
cout << *Iter5 << " ";
cout << ")." << endl;
}
The mod_lesser of the integers 6 & -7 is: 6.
The lesser of the integers -7 & 7 is: -7.
The lesser of the integers 6 & 7 is: 6.The mod_lesser of the integers 6 & -7 is: 6.
s1 = ( CInt( 1 ), CInt( 2 ) ).
s2 = ( CInt( 2 ), CInt( 3 ) ).
s3 = min ( s1, s2 ) = ( CInt( 1 ), CInt( 2 ) ).
Vector v1 is ( 0 1 2 ).
Vector v2 is ( 0 1 2 ).
Vector v3 is ( 0 2 4 ).
Vector v4 = min ( v1,v2 ) is ( 0 1 2 ).
Vector v5 = min ( v1,v3 ) is ( 0 1 2 ).
min_element
Localiza a primeira ocorrência do menor elemento em um intervalo especificado onde o critério de ordenação pode ser especificado por um predicado binário.
template<class ForwardIterator>
constexpr ForwardIterator min_element(
ForwardIterator first,
ForwardIterator last );
template<class ForwardIterator, class Compare>
constexpr ForwardIterator min_element(
ForwardIterator first,
ForwardIterator last,
Compare pred);
template<class ExecutionPolicy, class ForwardIterator>
ForwardIterator min_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class Compare>
ForwardIterator min_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador avançado que aborda a posição do primeiro elemento no intervalo a ser pesquisado para o menor elemento.
last
Um iterador avançado que aborda a posição um após o elemento final no intervalo a ser pesquisado para o menor elemento.
pred
Objeto de função de predicado definido pelo usuário que define o sentido em que um elemento é menor que outro. O predicado de comparação usa dois argumentos e deve retornar true quando o primeiro elemento é menor que o segundo elemento, e false caso contrário.
Valor de retorno
Um iterador de encaminhamento abordando a posição da primeira ocorrência do menor elemento no intervalo pesquisado.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição é alcançável a partir da primeira por incremento.
A complexidade é linear: (last - first) - 1 são necessárias comparações para um intervalo não vazio.
Exemplo
// alg_min_element.cpp
// compile with: /EHsc
#include <vector>
#include <set>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
{
public:
CInt( int n = 0 ) : m_nVal( n ){}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ){}
CInt& operator=( const CInt& rhs ) {m_nVal =
rhs.m_nVal; return *this;}
bool operator<( const CInt& rhs ) const
{return ( m_nVal < rhs.m_nVal );}
friend ostream& operator<<( ostream& osIn, const CInt& rhs );
private:
int m_nVal;
};
inline ostream& operator<<( ostream& osIn, const CInt& rhs )
{
osIn << "CInt( " << rhs.m_nVal << " )";
return osIn;
}
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
};
int main()
{
// Searching a set container with elements of type CInt
// for the minimum element
CInt c1 = 1, c2 = 2, c3 = -3;
set<CInt> s1;
set<CInt>::iterator s1_Iter, s1_R1_Iter, s1_R2_Iter;
s1.insert ( c1 );
s1.insert ( c2 );
s1.insert ( c3 );
cout << "s1 = (";
for ( s1_Iter = s1.begin( ); s1_Iter != --s1.end( ); s1_Iter++ )
cout << " " << *s1_Iter << ",";
s1_Iter = --s1.end( );
cout << " " << *s1_Iter << " )." << endl;
s1_R1_Iter = min_element ( s1.begin( ), s1.end( ) );
cout << "The smallest element in s1 is: " << *s1_R1_Iter << endl;
cout << endl;
// Searching a vector with elements of type int for the maximum
// element under default less than & mod_lesser binary predicates
vector<int> v1;
vector<int>::iterator v1_Iter, v1_R1_Iter, v1_R2_Iter;
int i;
for ( i = 0 ; i <= 3 ; i++ )
{
v1.push_back( i );
}
int ii;
for ( ii = 1 ; ii <= 4 ; ii++ )
{
v1.push_back( - 2 * ii );
}
cout << "Vector v1 is ( " ;
for ( v1_Iter = v1.begin( ) ; v1_Iter != v1.end( ) ; v1_Iter++ )
cout << *v1_Iter << " ";
cout << ")." << endl;
v1_R1_Iter = min_element ( v1.begin( ), v1.end( ) );
v1_R2_Iter = min_element ( v1.begin( ), v1.end( ), mod_lesser);
cout << "The smallest element in v1 is: " << *v1_R1_Iter << endl;
cout << "The smallest element in v1 under the mod_lesser"
<< "\n binary predicate is: " << *v1_R2_Iter << endl;
}
s1 = ( CInt( -3 ), CInt( 1 ), CInt( 2 ) ).
The smallest element in s1 is: CInt( -3 )
Vector v1 is ( 0 1 2 3 -2 -4 -6 -8 ).
The smallest element in v1 is: -8
The smallest element in v1 under the mod_lesser
binary predicate is: 0
minmax_element
Executa o trabalho realizado por min_element e max_element em uma chamada.
template<class ForwardIterator>
constexpr pair<ForwardIterator, ForwardIterator> minmax_element(
ForwardIterator first,
ForwardIterator last);
template<class ForwardIterator, class Compare>
constexpr pair<ForwardIterator, ForwardIterator> minmax_element(
ForwardIterator first,
ForwardIterator last,
Compare pred);
template<class ExecutionPolicy, class ForwardIterator>
pair<ForwardIterator, ForwardIterator> minmax_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class Compare>
pair<ForwardIterator, ForwardIterator> minmax_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de encaminhamento que indica o início de um intervalo.
last
Um iterador de encaminhamento que indica o fim de um intervalo.
pred
Um objeto de função de predicado definido pelo usuário que define o sentido em que um elemento é menor que outro. O predicado de comparação usa dois argumentos e deve retornar true quando o primeiro for menor que o segundo, e false caso contrário.
Valor de retorno
Devoluções
pair<ForwardIterator, ForwardIterator>( min_element(first, last), max_element(first, last)).
Observações
A primeira função de modelo retorna
pair<ForwardIterator,ForwardIterator>(min_element(first,last), max_element(first,last)).
A segunda função de modelo se comporta da mesma forma, exceto que substitui operator<(X, Y) por pred(X, Y).
Se a sequência não estiver vazia, a função será executada na maioria das 3 * (last - first - 1) / 2 comparações.
minmax
Compara dois parâmetros de entrada e os retorna como um par, em ordem de menor para maior.
template<class Type>
constexpr pair<const Type&, const Type&> minmax(
const Type& left,
const Type& right);
template<class Type, class BinaryPredicate>
constexpr pair<const Type&, const Type&> minmax(
const Type& left,
const Type& right,
BinaryPredicate pred);
template<class Type>
constexpr pair<Type&, Type&> minmax(
initializer_list<Type> ilist);
template<class Type, class BinaryPredicate>
constexpr pair<Type&, Type&> minmax(
initializer_list<Type> ilist,
BinaryPredicate pred);
Parâmetros
left
O primeiro dos dois objetos que estão sendo comparados.
right
O segundo dos dois objetos que estão sendo comparados.
pred
Um predicado binário usado para comparar os dois objetos.
inlist
O initializer_list que contém os membros a serem comparados.
Observações
A primeira função de modelo retorna pair<const Type&, const Type&>( right, left ) se right for menor que left. Caso contrário, ele retorna pair<const Type&, const Type&>( left, right ).
A função de segundo membro retorna um par onde o primeiro elemento é o menor e o segundo é o maior quando comparado pelo predicado pred.
As restantes funções de modelo comportam-se da mesma forma, exceto que substituem os left parâmetros e por rightinlist.
A função executa exatamente uma comparação.
mismatch
Compara dois intervalos elemento por elemento e localiza a primeira posição onde ocorre uma diferença.
Use as sobrecargas de intervalo duplo no código C++14 porque as sobrecargas que levam apenas um único iterador para o segundo intervalo não detetarão diferenças se o segundo intervalo for maior do que o primeiro intervalo. Essas sobrecargas resultarão em comportamento indefinido se o segundo intervalo for menor do que o primeiro.
template<class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2>>
mismatch(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2 );
template<class InputIterator1, class InputIterator2, class BinaryPredicate> pair<InputIterator1, InputIterator2>>
mismatch(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
BinaryPredicate pred );
//C++14
template<class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2>>
mismatch(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2 );
template<class InputIterator1, class InputIterator2, class BinaryPredicate> pair<InputIterator1, InputIterator2>>
mismatch(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
BinaryPredicate pred);
//C++17
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
pair<ForwardIterator1, ForwardIterator2>
mismatch(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
pair<ForwardIterator1, ForwardIterator2>
mismatch(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
pair<ForwardIterator1, ForwardIterator2>
mismatch(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
pair<ForwardIterator1, ForwardIterator2>
mismatch(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador de entrada que aborda a posição do primeiro elemento no primeiro intervalo a ser testado.
last1
Um iterador de entrada que aborda a posição um após o último elemento no primeiro intervalo a ser testado.
first2
Um iterador de entrada que aborda a posição do primeiro elemento no segundo intervalo a ser testado.
last2
Um iterador de entrada que aborda a posição de um passado o último elemento no segundo intervalo a ser testado.
pred
Objeto de função de predicado definido pelo usuário que compara os elementos atuais em cada intervalo e determina se eles são equivalentes. Retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
Retorna um par de iteradores abordando as posições da incompatibilidade nos dois intervalos. O primeiro iterador de componente aponta para a posição no primeiro intervalo. O segundo iterador de componente aponta para a posição no segundo intervalo. Se não houver diferença entre os elementos nos intervalos comparados ou se o predicado binário na segunda versão for satisfeito por todos os pares de elementos dos dois intervalos, então o primeiro iterador de componente aponta para a posição um após o elemento final no primeiro intervalo e o segundo iterador de componente aponta para uma posição um após o elemento final testado no segundo intervalo.
Observações
A primeira função de modelo assume que há tantos elementos no intervalo começando no início2 quanto há no intervalo designado por [first1, last1). Se houver mais na segunda faixa, eles são ignorados; se houver menos, o comportamento indefinido resultará.
O intervalo a pesquisar deve ser válido; Todos os iteradores devem ser desreferenciados e a última posição é alcançável a partir da primeira por incremento.
A complexidade temporal do algoritmo é linear no número de elementos contidos no intervalo mais curto.
O predicado definido pelo usuário não é necessário para impor uma relação de equivalência simétrica, reflexiva e transitiva entre seus operandos.
Exemplo
O exemplo a seguir demonstra como usar a incompatibilidade. A sobrecarga C++03 é mostrada apenas para demonstrar como ela pode produzir um resultado inesperado.
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
#include <string>
#include <utility>
using namespace std;
// Return whether first element is twice the second
// Note that this isn't a symmetric, reflexive, and transitive equivalence.
// mismatch and equal accept such predicates, but is_permutation doesn't.
bool twice(int elem1, int elem2)
{
return elem1 == elem2 * 2;
}
void PrintResult(const string& msg, const pair<vector<int>::iterator, vector<int>::iterator>& result,
const vector<int>& left, const vector<int>& right)
{
// If either iterator stops before reaching the end of its container,
// it means a mismatch was detected.
if (result.first != left.end() || result.second != right.end())
{
string leftpos(result.first == left.end() ? "end" : to_string(*result.first));
string rightpos(result.second == right.end() ? "end" : to_string(*result.second));
cout << msg << "mismatch. Left iterator at " << leftpos
<< " right iterator at " << rightpos << endl;
}
else
{
cout << msg << " match." << endl;
}
}
int main()
{
vector<int> vec_1{ 0, 5, 10, 15, 20, 25 };
vector<int> vec_2{ 0, 5, 10, 15, 20, 25, 30 };
// Testing different length vectors for mismatch (C++03)
auto match_vecs = mismatch(vec_1.begin(), vec_1.end(), vec_2.begin());
bool is_mismatch = match_vecs.first != vec_1.end();
cout << "C++03: vec_1 and vec_2 are a mismatch: " << boolalpha << is_mismatch << endl;
// Using dual-range overloads:
// Testing different length vectors for mismatch (C++14)
match_vecs = mismatch(vec_1.begin(), vec_1.end(), vec_2.begin(), vec_2.end());
PrintResult("C++14: vec_1 and vec_2: ", match_vecs, vec_1, vec_2);
// Identify point of mismatch between vec_1 and modified vec_2.
vec_2[3] = 42;
match_vecs = mismatch(vec_1.begin(), vec_1.end(), vec_2.begin(), vec_2.end());
PrintResult("C++14 vec_1 v. vec_2 modified: ", match_vecs, vec_1, vec_2);
// Test vec_3 and vec_4 for mismatch under the binary predicate twice (C++14)
vector<int> vec_3{ 10, 20, 30, 40, 50, 60 };
vector<int> vec_4{ 5, 10, 15, 20, 25, 30 };
match_vecs = mismatch(vec_3.begin(), vec_3.end(), vec_4.begin(), vec_4.end(), twice);
PrintResult("vec_3 v. vec_4 with pred: ", match_vecs, vec_3, vec_4);
vec_4[5] = 31;
match_vecs = mismatch(vec_3.begin(), vec_3.end(), vec_4.begin(), vec_4.end(), twice);
PrintResult("vec_3 v. modified vec_4 with pred: ", match_vecs, vec_3, vec_4);
// Compare a vector<int> to a list<int>
list<int> list_1{ 0, 5, 10, 15, 20, 25 };
auto match_vec_list = mismatch(vec_1.begin(), vec_1.end(), list_1.begin(), list_1.end());
is_mismatch = match_vec_list.first != vec_1.end() || match_vec_list.second != list_1.end();
cout << "vec_1 and list_1 are a mismatch: " << boolalpha << is_mismatch << endl;
char c;
cout << "Press a key" << endl;
cin >> c;
}
C++03: vec_1 and vec_2 are a mismatch: false
C++14: vec_1 and vec_2: mismatch. Left iterator at end right iterator at 30
C++14 vec_1 v. vec_2 modified: mismatch. Left iterator at 15 right iterator at 42
C++14 vec_3 v. vec_4 with pred: match.
C++14 vec_3 v. modified vec_4 with pred: mismatch. Left iterator at 60 right iterator at 31
C++14: vec_1 and list_1 are a mismatch: false
Press a key
<alg> move
Mover elementos associados a um intervalo especificado.
template<class InputIterator, class OutputIterator>
OutputIterator move(
InputIterator first,
InputIterator last,
OutputIterator dest);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 move(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que indica onde iniciar o intervalo de elementos a serem movidos.
last
Um iterador de entrada que indica o fim de um intervalo de elementos a serem movidos.
dest
O iterador de saída que deve conter os elementos movidos.
Observações
A função de modelo avalia *(dest + N) = move(*(first + N)) uma vez para cada N um no intervalo [0, last - first), para valores estritamente crescentes de N começar com o menor valor. Em seguida, ele retorna dest + N. Se dest e first designar regiões de armazenamento, dest não deve estar no intervalo [first, last).
move_backward
Move os elementos de um iterador para outro. A movimentação começa com o último elemento em um intervalo especificado e termina com o primeiro elemento nesse intervalo.
template<class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 move_backward(
BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 destEnd);
Parâmetros
first
Um iterador que indica o início de um intervalo do qual mover elementos.
last
Um iterador que indica o fim de um intervalo do qual mover elementos. Este elemento não é movido.
destEnd
Um iterador bidirecional que aborda a posição de um passado do elemento final no intervalo de destino.
Observações
A função de modelo avalia *(destEnd - N - 1) = move(*(last - N - 1)) uma vez para cada N um no intervalo [0, last - first), para valores estritamente crescentes de N começar com o menor valor. Em seguida, ele retorna destEnd - (last - first). Se destEnd e first designar regiões de armazenamento, destEnd não deve estar no intervalo [first, last).
move e move_backward são funcionalmente equivalentes ao uso copy e copy_backward com um iterador de movimento.
next_permutation
Reordena os elementos em um intervalo para que a ordem original seja substituída pela permutação lexicograficamente seguinte maior, se existir. O sentido de lexicograficamente seguinte pode ser especificado com um predicado binário.
template<class BidirectionalIterator>
bool next_permutation(
BidirectionalIterator first,
BidirectionalIterator last);
template<class BidirectionalIterator, class BinaryPredicate>
bool next_permutation(
BidirectionalIterator first,
BidirectionalIterator last,
BinaryPredicate pred);
Parâmetros
first
Um iterador bidirecional apontando para a posição do primeiro elemento no intervalo a ser permutado.
last
Um iterador bidirecional apontando para a posição um após o elemento final no intervalo a ser permutado.
pred
Objeto de função de predicado definido pelo usuário que define o critério de comparação a ser satisfeito por elementos sucessivos na ordenação. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
true se a permutação lexicograficamente seguinte existir e tiver substituído a ordem original do intervalo; caso contrário false, caso em que a ordenação é transformada na menor permutação lexicograficamente.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
O predicado binário padrão é menor que e os elementos no intervalo devem ser menores do que comparáveis para garantir que a próxima permutação seja bem definida.
A complexidade é linear com, no máximo (last - first) / 2 , swaps.
Exemplo
// alg_next_perm.cpp
// compile with: /EHsc
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
{
public:
CInt( int n = 0 ) : m_nVal( n ) {}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ) {}
CInt& operator=( const CInt& rhs ) {m_nVal =
rhs.m_nVal; return *this;}
bool operator<( const CInt& rhs ) const
{ return ( m_nVal < rhs.m_nVal ); }
friend ostream& operator<<( ostream& osIn, const CInt& rhs );
private:
int m_nVal;
};
inline ostream& operator<<( ostream& osIn, const CInt& rhs )
{
osIn << "CInt( " << rhs.m_nVal << " )";
return osIn;
}
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
};
int main()
{
// Reordering the elements of type CInt in a deque
// using the prev_permutation algorithm
CInt c1 = 5, c2 = 1, c3 = 10;
bool deq1Result;
deque<CInt> deq1, deq2, deq3;
deque<CInt>::iterator d1_Iter;
deq1.push_back ( c1 );
deq1.push_back ( c2 );
deq1.push_back ( c3 );
cout << "The original deque of CInts is deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl;
deq1Result = next_permutation ( deq1.begin( ), deq1.end( ) );
if ( deq1Result )
cout << "The lexicographically next permutation "
<< "exists and has\nreplaced the original "
<< "ordering of the sequence in deq1." << endl;
else
cout << "The lexicographically next permutation doesn't "
<< "exist\n and the lexicographically "
<< "smallest permutation\n has replaced the "
<< "original ordering of the sequence in deq1." << endl;
cout << "After one application of next_permutation,\n deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl << endl;
// Permuting vector elements with binary function mod_lesser
vector<int> v1;
vector<int>::iterator Iter1;
int i;
for ( i = -3 ; i <= 3 ; i++ )
{
v1.push_back( i );
}
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
next_permutation ( v1.begin( ), v1.end( ), mod_lesser );
cout << "After the first next_permutation, vector v1 is:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
int iii = 1;
while ( iii <= 5 ) {
next_permutation ( v1.begin( ), v1.end( ), mod_lesser );
cout << "After another next_permutation of vector v1,\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ;Iter1 ++ )
cout << *Iter1 << " ";
cout << ")." << endl;
iii++;
}
}
The original deque of CInts is deq1 = ( CInt( 5 ), CInt( 1 ), CInt( 10 ) ).
The lexicographically next permutation exists and has
replaced the original ordering of the sequence in deq1.
After one application of next_permutation,
deq1 = ( CInt( 5 ), CInt( 10 ), CInt( 1 ) ).
Vector v1 is ( -3 -2 -1 0 1 2 3 ).
After the first next_permutation, vector v1 is:
v1 = ( -3 -2 -1 0 1 3 2 ).
After another next_permutation of vector v1,
v1 = ( -3 -2 -1 0 2 1 3 ).
After another next_permutation of vector v1,
v1 = ( -3 -2 -1 0 2 3 1 ).
After another next_permutation of vector v1,
v1 = ( -3 -2 -1 0 3 1 2 ).
After another next_permutation of vector v1,
v1 = ( -3 -2 -1 0 3 2 1 ).
After another next_permutation of vector v1,
v1 = ( -3 -2 -1 1 0 2 3 ).
nth_element
Particiona um intervalo de elementos, localizando corretamente o nésimo elemento da sequência no intervalo que atende a estes critérios: Todos os elementos à sua frente são menores ou iguais a ele, e todos os elementos que o seguem são maiores ou iguais a ele.
template<class RandomAccessIterator>
void nth_element(
RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void nth_element(
RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last,
Compare pred);
template<class ExecutionPolicy, class RandomAccessIterator>
void nth_element(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last);
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
void nth_element(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de acesso aleatório que aborda a posição do primeiro elemento no intervalo a ser particionado.
nth
Um iterador de acesso aleatório que aborda a posição do elemento a ser ordenado corretamente no limite da partição.
last
Um iterador de acesso aleatório endereçando a posição um após o elemento final no intervalo a ser particionado.
pred
Objeto de função de predicado definido pelo usuário que define o critério de comparação a ser satisfeito por elementos sucessivos na ordenação. Um predicado de comparação usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
O nth_element algoritmo não garante que os elementos nos subintervalos de ambos os lados do nésimo elemento sejam classificados. Assim, ele faz menos garantias do que partial_sorto , que ordena os elementos na faixa abaixo de algum elemento escolhido, e pode ser usado como uma alternativa mais rápida para partial_sort quando a ordenação da faixa inferior não é necessária.
Os elementos são equivalentes, mas não necessariamente iguais, se nenhum for menor que o outro.
A média de uma complexidade de classificação é linear em relação a last - first.
Exemplo
// alg_nth_elem.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether first element is greater than the second
bool UDgreater ( int elem1, int elem2 ) {
return elem1 > elem2;
}
int main() {
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1;
int i;
for ( i = 0 ; i <= 5 ; i++ )
v1.push_back( 3 * i );
int ii;
for ( ii = 0 ; ii <= 5 ; ii++ )
v1.push_back( 3 * ii + 1 );
int iii;
for ( iii = 0 ; iii <= 5 ; iii++ )
v1.push_back( 3 * iii +2 );
cout << "Original vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
nth_element(v1.begin( ), v1.begin( ) + 3, v1.end( ) );
cout << "Position 3 partitioned vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// To sort in descending order, specify binary predicate
nth_element( v1.begin( ), v1.begin( ) + 4, v1.end( ),
greater<int>( ) );
cout << "Position 4 partitioned (greater) vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
random_shuffle( v1.begin( ), v1.end( ) );
cout << "Shuffled vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// A user-defined (UD) binary predicate can also be used
nth_element( v1.begin( ), v1.begin( ) + 5, v1.end( ), UDgreater );
cout << "Position 5 partitioned (UDgreater) vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
}
v1 = ( 0 3 6 9 12 15 1 4 7 10 13 16 2 5 8 11 14 17 )
Position 3 partitioned vector:
v1 = ( 1 0 2 3 8 5 9 4 7 6 10 16 13 15 12 11 14 17 )
Position 4 partitioned (greater) vector:
v1 = ( 16 17 14 15 13 12 11 9 7 8 10 6 1 4 5 3 2 0 )
Shuffled vector:
v1 = ( 13 10 6 3 5 2 0 17 11 8 15 9 7 14 16 1 12 4 )
Position 5 partitioned (UDgreater) vector:
v1 = ( 14 17 15 16 13 12 10 11 9 8 0 2 7 5 3 1 6 4 )
none_of
Retorna true quando uma condição nunca está presente entre os elementos no intervalo determinado.
template<class InputIterator, class UnaryPredicate>
bool none_of(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template <class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
bool none_of(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que indica por onde começar para verificar uma variedade de elementos para uma condição.
last
Um iterador de entrada que indica o fim de um intervalo de elementos.
pred
A condição para testar. Esse teste é fornecido por um objeto de função de predicado definido pelo usuário que define a condição. Um predicado unário pega um único argumento e retorna true ou false.
Valor de retorno
Retorna true se a condição não for detetada pelo menos uma vez no intervalo indicado e false se a condição for detetada.
Observações
A função de modelo retorna true somente se, para alguns N no intervalo [0, last - first), o predicado pred(*(first + N)) for sempre false.
partial_sort
Organiza um número especificado de elementos menores em um intervalo em uma ordem não decrescente. Um predicado binário pode fornecer um critério de ordenação.
template<class RandomAccessIterator>
void partial_sort(
RandomAccessIterator first,
RandomAccessIterator sortEnd,
RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void partial_sort(
RandomAccessIterator first,
RandomAccessIterator sortEnd,
RandomAccessIterator last,
Compare pred);
template<class ExecutionPolicy, class RandomAccessIterator>
void partial_sort(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator middle,
RandomAccessIterator last);
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
void partial_sort(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator middle,
RandomAccessIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de acesso aleatório abordando a posição do primeiro elemento no intervalo a ser classificado.
sortEnd
Um iterador de acesso aleatório endereçando a posição um após o elemento final no subintervalo a ser classificado.
last
Um iterador de acesso aleatório que aborda a posição um após o elemento final no intervalo a ser parcialmente classificado.
pred
Objeto de função de predicado definido pelo usuário que define o critério de comparação a ser satisfeito por elementos sucessivos na ordenação. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
Os elementos são equivalentes, mas não necessariamente iguais, se nenhum for menor que o outro. O sort algoritmo não é estável e não garante que a ordenação relativa de elementos equivalentes será preservada. O algoritmo stable_sort preserva essa ordem original.
A complexidade média de classificação parcial é O((last- first) log (sortEnd- first)).
Exemplo
// alg_partial_sort.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether first element is greater than the second
bool UDgreater ( int elem1, int elem2 )
{
return elem1 > elem2;
}
int main()
{
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1;
int i;
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 2 * i );
}
int ii;
for ( ii = 0 ; ii <= 5 ; ii++ )
{
v1.push_back( 2 * ii +1 );
}
cout << "Original vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
partial_sort(v1.begin( ), v1.begin( ) + 6, v1.end( ) );
cout << "Partially sorted vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// To partially sort in descending order, specify binary predicate
partial_sort(v1.begin( ), v1.begin( ) + 4, v1.end( ), greater<int>( ) );
cout << "Partially resorted (greater) vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// A user-defined (UD) binary predicate can also be used
partial_sort(v1.begin( ), v1.begin( ) + 8, v1.end( ), UDgreater );
cout << "Partially resorted (UDgreater) vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
}
Original vector:
v1 = ( 0 2 4 6 8 10 1 3 5 7 9 11 )
Partially sorted vector:
v1 = ( 0 1 2 3 4 5 10 8 6 7 9 11 )
Partially resorted (greater) vector:
v1 = ( 11 10 9 8 0 1 2 3 4 5 6 7 )
Partially resorted (UDgreater) vector:
v1 = ( 11 10 9 8 7 6 5 4 0 1 2 3 )
partial_sort_copy
Copia elementos de um intervalo de origem para um intervalo de destino onde os elementos de origem são ordenados por menos de ou outro predicado binário especificado.
template<class InputIterator, class RandomAccessIterator>
RandomAccessIterator partial_sort_copy(
InputIterator first1,
InputIterator last1,
RandomAccessIterator first2,
RandomAccessIterator last2 );
template<class InputIterator, class RandomAccessIterator, class Compare>
RandomAccessIterator partial_sort_copy(
InputIterator first1,
InputIterator last1,
RandomAccessIterator first2,
RandomAccessIterator last2,
Compare pred);
template<class ExecutionPolicy, class ForwardIterator, class RandomAccessIterator>
RandomAccessIterator partial_sort_copy(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
RandomAccessIterator result_first,
RandomAccessIterator result_last);
template<class ExecutionPolicy, class ForwardIterator, class RandomAccessIterator, class Compare>
RandomAccessIterator partial_sort_copy(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
RandomAccessIterator result_first,
RandomAccessIterator result_last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador de entrada que aborda a posição do primeiro elemento no intervalo de origem.
last1
Um iterador de entrada que aborda a posição um após o elemento final no intervalo de origem.
first2
Um iterador de acesso aleatório que aborda a posição do primeiro elemento no intervalo de destino classificado.
last2
Um iterador de acesso aleatório endereçando a posição um após o elemento final no intervalo de destino classificado.
pred
Objeto de função de predicado definido pelo usuário que define o critério de comparação a ser satisfeito por elementos sucessivos na ordenação. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
Um iterador de acesso aleatório endereçando o elemento no intervalo de destino uma posição além do último elemento inserido a partir do intervalo de origem.
Observações
Os intervalos de origem e destino não devem sobrepor-se e devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição deve ser alcançável a partir da primeira por incremento.
O predicado binário deve fornecer uma ordenação fraca estrita para que os elementos que não são equivalentes sejam ordenados, mas os elementos que são equivalentes não sejam. Dois elementos são equivalentes sob menos, mas não necessariamente iguais, se um for menor que o outro.
Exemplo
// alg_partial_sort_copy.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <algorithm>
#include <functional>
#include <iostream>
int main() {
using namespace std;
vector<int> v1, v2;
list<int> list1;
vector<int>::iterator iter1, iter2;
list<int>::iterator list1_Iter, list1_inIter;
int i;
for (i = 0; i <= 9; i++)
v1.push_back(i);
random_shuffle(v1.begin(), v1.end());
list1.push_back(60);
list1.push_back(50);
list1.push_back(20);
list1.push_back(30);
list1.push_back(40);
list1.push_back(10);
cout << "Vector v1 = ( " ;
for (iter1 = v1.begin(); iter1 != v1.end(); iter1++)
cout << *iter1 << " ";
cout << ")" << endl;
cout << "List list1 = ( " ;
for (list1_Iter = list1.begin();
list1_Iter!= list1.end();
list1_Iter++)
cout << *list1_Iter << " ";
cout << ")" << endl;
// Copying a partially sorted copy of list1 into v1
vector<int>::iterator result1;
result1 = partial_sort_copy(list1.begin(), list1.end(),
v1.begin(), v1.begin() + 3);
cout << "List list1 Vector v1 = ( " ;
for (iter1 = v1.begin() ; iter1 != v1.end() ; iter1++)
cout << *iter1 << " ";
cout << ")" << endl;
cout << "The first v1 element one position beyond"
<< "\n the last L 1 element inserted was " << *result1
<< "." << endl;
// Copying a partially sorted copy of list1 into v2
int ii;
for (ii = 0; ii <= 9; ii++)
v2.push_back(ii);
random_shuffle(v2.begin(), v2.end());
vector<int>::iterator result2;
result2 = partial_sort_copy(list1.begin(), list1.end(),
v2.begin(), v2.begin() + 6);
cout << "List list1 into Vector v2 = ( " ;
for (iter2 = v2.begin() ; iter2 != v2.end(); iter2++)
cout << *iter2 << " ";
cout << ")" << endl;
cout << "The first v2 element one position beyond"
<< "\n the last L 1 element inserted was " << *result2
<< "." << endl;
}
Vector v1 = ( 4 3 7 8 0 5 2 1 6 9 )
List list1 = ( 60 50 20 30 40 10 )
List list1 Vector v1 = ( 10 20 30 8 0 5 2 1 6 9 )
The first v1 element one position beyond
the last L 1 element inserted was 8.
List list1 into Vector v2 = ( 10 20 30 40 50 60 9 6 7 8 )
The first v2 element one position beyond
the last L 1 element inserted was 9.
partition
Classifica os elementos em um intervalo em dois conjuntos disjuntos, com esses elementos satisfazendo um predicado unário precedendo os que não o satisfazem.
template<class BidirectionalIterator, class UnaryPredicate>
BidirectionalIterator partition(
BidirectionalIterator first,
BidirectionalIterator last,
UnaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
ForwardIterator partition(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador bidirecional que aborda a posição do primeiro elemento no intervalo a ser particionado.
last
Um iterador bidirecional que aborda a posição um após o elemento final no intervalo a ser particionado.
pred
Objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita se um elemento deve ser classificado. Um predicado unário pega um único argumento e retorna true ou false.
Valor de retorno
Um iterador bidirecional que aborda a posição do primeiro elemento no intervalo para não satisfazer a condição de predicado.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
Elementos a e b são equivalentes, mas não necessariamente iguais, se ambos pred( a, b ) são falsos e pred( b, a ) são falsos, onde pred é o predicado especificado pelo parâmetro. O partition algoritmo não é estável e não garante que a ordenação relativa de elementos equivalentes será preservada. O algoritmo stable_partition preserva essa ordem original.
A complexidade é linear: há (last - first) aplicações de pred e no máximo (last - first)/2 swaps.
Exemplo
// alg_partition.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
bool greater5 ( int value )
{
return value > 5;
}
int main()
{
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1, Iter2;
int i;
for ( i = 0 ; i <= 10 ; i++ )
{
v1.push_back( i );
}
random_shuffle( v1.begin( ), v1.end( ) );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Partition the range with predicate greater10
partition ( v1.begin( ), v1.end( ), greater5 );
cout << "The partitioned set of elements in v1 is: ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
}
Vector v1 is ( 4 10 7 8 0 5 2 1 6 9 3 ).
The partitioned set of elements in v1 is: ( 9 10 7 8 6 5 2 1 0 4 3 ).
partition_copy
Copia elementos para os quais uma condição é true para um destino e para os quais a condição é false para outro. Os elementos devem vir de um intervalo especificado.
template<class InputIterator, class OutputIterator1, class OutputIterator2, class UnaryPredicate>
pair<OutputIterator1, OutputIterator2> partition_copy(
InputIterator first,
InputIterator last,
OutputIterator1 dest1,
OutputIterator2 dest2,
UnaryPredicate pred);
template <class ExecutionPolicy, class ForwardIterator, class ForwardIterator1, class ForwardIterator2, class UnaryPredicate>
pair<ForwardIterator1, ForwardIterator2> partition_copy(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
ForwardIterator1 out_true,
ForwardIterator2 out_false,
UnaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que indica o início de um intervalo para verificar uma condição.
last
Um iterador de entrada que indica o fim de um intervalo.
dest1
Um iterador de saída usado para copiar elementos que retornam true para uma condição testada usando pred.
dest2
Um iterador de saída usado para copiar elementos que retornam false para uma condição testada usando pred.
pred
A condição para testar. O teste é fornecido por um objeto de função de predicado definido pelo usuário que define a condição a ser testada. Um predicado unário pega um único argumento e retorna true ou false.
Observações
A função de modelo copia cada elemento X para [first,last)*dest1++ se pred(X) é verdadeiro, ou para *dest2++ se não. Ele retorna pair<OutputIterator1, OutputIterator2>(dest1, dest2).
partition_point
Retorna o primeiro elemento no intervalo determinado que não satisfaz a condição. Os elementos são ordenados de modo a que os que satisfazem a condição venham antes dos que não satisfazem.
template<class ForwardIterator, class UnaryPredicate>
ForwardIterator partition_point(
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
Parâmetros
first
A ForwardIterator que indica o início de um intervalo para verificar uma condição.
last
A ForwardIterator que indica o fim de um intervalo.
pred
A condição para testar. O teste é fornecido por um objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita pelo elemento que está sendo pesquisado. Um predicado unário pega um único argumento e retorna true ou false.
Valor de retorno
Retorna um ForwardIterator que se refere ao primeiro elemento que não cumpre a condição testada pelo pred, ou retorna last se um não for encontrado.
Observações
A função de modelo localiza o primeiro iterador it no [first, last) qual pred(*it) é false. A sequência deve ser ordenada por pred.
pop_heap
Remove o elemento maior da frente de uma pilha para a penúltima posição no intervalo e, em seguida, forma uma nova pilha a partir dos elementos restantes.
template<class RandomAccessIterator>
void pop_heap(
RandomAccessIterator first,
RandomAccessIterator last);
template<class RandomAccessIterator, class BinaryPredicate>
void pop_heap(
RandomAccessIterator first,
RandomAccessIterator last,
BinaryPredicate pred);
Parâmetros
first
Um iterador de acesso aleatório abordando a posição do primeiro elemento na pilha.
last
Um iterador de acesso aleatório abordando a posição um após o elemento final na pilha.
pred
Objeto de função de predicado definido pelo usuário que define o sentido no qual um elemento é menor que outro. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Observações
O pop_heap algoritmo é o inverso da operação realizada pelo algoritmo push_heap, no qual um elemento na penúltima posição de um intervalo é adicionado a um heap que consiste nos elementos anteriores no intervalo, no caso em que o elemento que está sendo adicionado ao heap é maior do que qualquer um dos elementos já no heap.
As pilhas têm duas propriedades:
O primeiro elemento é sempre o maior.
Os elementos podem ser adicionados ou removidos em tempo logarítmico.
Os heaps são uma maneira ideal de implementar filas de prioridade e são usados na implementação do adaptador de contêiner C++ Standard Library priority_queue Class.
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
O intervalo excluindo o elemento recém-adicionado no final deve ser um heap.
A complexidade é logarítmica, exigindo no máximo log (last - first) comparações.
Exemplo
// alg_pop_heap.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
int main()
{
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1, Iter2;
int i;
for ( i = 1 ; i <= 9 ; i++ )
v1.push_back( i );
// Make v1 a heap with default less than ordering
random_shuffle( v1.begin( ), v1.end( ) );
make_heap ( v1.begin( ), v1.end( ) );
cout << "The heaped version of vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Add an element to the back of the heap
v1.push_back( 10 );
push_heap( v1.begin( ), v1.end( ) );
cout << "The reheaped v1 with 10 added is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Remove the largest element from the heap
pop_heap( v1.begin( ), v1.end( ) );
cout << "The heap v1 with 10 removed is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl << endl;
// Make v1 a heap with greater-than ordering with a 0 element
make_heap ( v1.begin( ), v1.end( ), greater<int>( ) );
v1.push_back( 0 );
push_heap( v1.begin( ), v1.end( ), greater<int>( ) );
cout << "The 'greater than' reheaped v1 puts the smallest "
<< "element first:\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Application of pop_heap to remove the smallest element
pop_heap( v1.begin( ), v1.end( ), greater<int>( ) );
cout << "The 'greater than' heaped v1 with the smallest element\n "
<< "removed from the heap is: ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
}
The heaped version of vector v1 is ( 9 7 8 5 1 6 3 2 4 ).
The reheaped v1 with 10 added is ( 10 9 8 5 7 6 3 2 4 1 ).
The heap v1 with 10 removed is ( 9 7 8 5 1 6 3 2 4 10 ).
The 'greater than' reheaped v1 puts the smallest element first:
( 0 1 3 4 2 6 8 5 9 10 7 ).
The 'greater than' heaped v1 with the smallest element
removed from the heap is: ( 1 2 3 4 7 6 8 5 9 10 0 ).
prev_permutation
Reordena os elementos em um intervalo para que a ordem original seja substituída pela permutação maior lexicograficamente anterior, se existir. Um predicado binário pode especificar o sentido de lexicograficamente anterior.
template<class BidirectionalIterator>
bool prev_permutation(
BidirectionalIterator first,
BidirectionalIterator last);
template<class BidirectionalIterator, class BinaryPredicate>
bool prev_permutation(
BidirectionalIterator first,
BidirectionalIterator last,
BinaryPredicate pred);
Parâmetros
first
Um iterador bidirecional apontando para a posição do primeiro elemento no intervalo a ser permutado.
last
Um iterador bidirecional apontando para a posição um após o elemento final no intervalo a ser permutado.
pred
Objeto de função de predicado definido pelo usuário que define o critério de comparação a ser satisfeito por elementos sucessivos na ordenação. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
true se a permutação lexicograficamente anterior existe e substituiu a ordem original do intervalo; caso contrário false, caso em que a ordem é transformada na permutação lexicograficamente maior.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
O predicado binário padrão é menor do que e os elementos no intervalo devem ser menores do que comparáveis para garantir que a permutação anterior seja bem definida.
A complexidade é linear, com no máximo (last - first)/2 swaps.
Exemplo
// alg_prev_perm.cpp
// compile with: /EHsc
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt {
public:
CInt( int n = 0 ) : m_nVal( n ){}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ){}
CInt& operator=( const CInt& rhs ) {m_nVal =
rhs.m_nVal; return *this;}
bool operator<( const CInt& rhs ) const
{return ( m_nVal < rhs.m_nVal );}
friend ostream& operator<<( ostream& osIn, const CInt& rhs );
private:
int m_nVal;
};
inline ostream& operator<<( ostream& osIn, const CInt& rhs ) {
osIn << "CInt( " << rhs.m_nVal << " )";
return osIn;
}
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser (int elem1, int elem2 ) {
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
};
int main()
{
// Reordering the elements of type CInt in a deque
// using the prev_permutation algorithm
CInt c1 = 1, c2 = 5, c3 = 10;
bool deq1Result;
deque<CInt> deq1, deq2, deq3;
deque<CInt>::iterator d1_Iter;
deq1.push_back ( c1 );
deq1.push_back ( c2 );
deq1.push_back ( c3 );
cout << "The original deque of CInts is deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl;
deq1Result = prev_permutation ( deq1.begin( ), deq1.end( ) );
if ( deq1Result )
cout << "The lexicographically previous permutation "
<< "exists and has \nreplaced the original "
<< "ordering of the sequence in deq1." << endl;
else
cout << "The lexicographically previous permutation doesn't "
<< "exist\n and the lexicographically "
<< "smallest permutation\n has replaced the "
<< "original ordering of the sequence in deq1." << endl;
cout << "After one application of prev_permutation,\n deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl << endl;
// Permutating vector elements with binary function mod_lesser
vector<int> v1;
vector<int>::iterator Iter1;
int i;
for ( i = -3 ; i <= 3 ; i++ )
v1.push_back( i );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
prev_permutation ( v1.begin( ), v1.end( ), mod_lesser );
cout << "After the first prev_permutation, vector v1 is:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
int iii = 1;
while ( iii <= 5 ) {
prev_permutation ( v1.begin( ), v1.end( ), mod_lesser );
cout << "After another prev_permutation of vector v1,\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ;Iter1 ++ )
cout << *Iter1 << " ";
cout << ")." << endl;
iii++;
}
}
The original deque of CInts is deq1 = ( CInt( 1 ), CInt( 5 ), CInt( 10 ) ).
The lexicographically previous permutation doesn't exist
and the lexicographically smallest permutation
has replaced the original ordering of the sequence in deq1.
After one application of prev_permutation,
deq1 = ( CInt( 10 ), CInt( 5 ), CInt( 1 ) ).
Vector v1 is ( -3 -2 -1 0 1 2 3 ).
After the first prev_permutation, vector v1 is:
v1 = ( -3 -2 0 3 2 1 -1 ).
After another prev_permutation of vector v1,
v1 = ( -3 -2 0 3 -1 2 1 ).
After another prev_permutation of vector v1,
v1 = ( -3 -2 0 3 -1 1 2 ).
After another prev_permutation of vector v1,
v1 = ( -3 -2 0 2 3 1 -1 ).
After another prev_permutation of vector v1,
v1 = ( -3 -2 0 2 -1 3 1 ).
After another prev_permutation of vector v1,
v1 = ( -3 -2 0 2 -1 1 3 ).
push_heap
Adiciona um elemento que está no final de um intervalo a um heap existente que consiste nos elementos anteriores no intervalo.
template<class RandomAccessIterator>
void push_heap(
RandomAccessIterator first,
RandomAccessIterator last );
template<class RandomAccessIterator, class BinaryPredicate>
void push_heap(
RandomAccessIterator first,
RandomAccessIterator last,
BinaryPredicate pred);
Parâmetros
first
Um iterador de acesso aleatório abordando a posição do primeiro elemento na pilha.
last
Um iterador de acesso aleatório abordando a posição um após o elemento final no intervalo a ser convertido em um heap.
pred
Objeto de função de predicado definido pelo usuário que define o sentido no qual um elemento é menor que outro. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Observações
O elemento deve primeiro ser empurrado de volta para o final de um heap existente e, em seguida, o algoritmo é usado para adicionar esse elemento ao heap existente.
As pilhas têm duas propriedades:
O primeiro elemento é sempre o maior.
Os elementos podem ser adicionados ou removidos em tempo logarítmico.
Os heaps são uma maneira ideal de implementar filas de prioridade e são usados na implementação do adaptador de contêiner C++ Standard Library priority_queue Class.
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
O intervalo excluindo o elemento recém-adicionado no final deve ser um heap.
A complexidade é logarítmica, exigindo no máximo log(last - first) comparações.
Exemplo
// alg_push_heap.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
int main() {
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1, Iter2;
int i;
for ( i = 1 ; i <= 9 ; i++ )
v1.push_back( i );
random_shuffle( v1.begin( ), v1.end( ) );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Make v1 a heap with default less than ordering
make_heap ( v1.begin( ), v1.end( ) );
cout << "The heaped version of vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Add an element to the heap
v1.push_back( 10 );
cout << "The heap v1 with 10 pushed back is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
push_heap( v1.begin( ), v1.end( ) );
cout << "The reheaped v1 with 10 added is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl << endl;
// Make v1 a heap with greater than ordering
make_heap ( v1.begin( ), v1.end( ), greater<int>( ) );
cout << "The greater-than heaped version of v1 is\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
v1.push_back(0);
cout << "The greater-than heap v1 with 11 pushed back is\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
push_heap( v1.begin( ), v1.end( ), greater<int>( ) );
cout << "The greater than reheaped v1 with 11 added is\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
}
Vector v1 is ( 5 4 8 9 1 6 3 2 7 ).
The heaped version of vector v1 is ( 9 7 8 5 1 6 3 2 4 ).
The heap v1 with 10 pushed back is ( 9 7 8 5 1 6 3 2 4 10 ).
The reheaped v1 with 10 added is ( 10 9 8 5 7 6 3 2 4 1 ).
The greater-than heaped version of v1 is
( 1 2 3 4 7 6 8 5 10 9 ).
The greater-than heap v1 with 11 pushed back is
( 1 2 3 4 7 6 8 5 10 9 0 ).
The greater than reheaped v1 with 11 added is
( 0 1 3 4 2 6 8 5 10 9 7 ).
random_shuffle
A std::random_shuffle() função foi preterida, substituída por std::shuffle. Para obter um exemplo de código e mais informações, consulte <random> e a postagem Estouro de pilha Por que os métodos estão std::random_shuffle sendo preteridos no C++14?.
remove
Elimina um valor especificado de um determinado intervalo sem perturbar a ordem dos elementos restantes. Retorna o final de um novo intervalo livre do valor especificado.
template<class ForwardIterator, class Type>
ForwardIterator remove(
ForwardIterator first,
ForwardIterator last,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator, class Type>
ForwardIterator remove(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
const Type& value);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de encaminhamento abordando a posição do primeiro elemento no intervalo do qual os elementos estão sendo removidos.
last
Um iterador avançado abordando a posição um após o elemento final no intervalo do qual os elementos estão sendo removidos.
value
O valor que deve ser removido do intervalo.
Valor de retorno
Um iterador de encaminhamento endereçando a nova posição final do intervalo modificado, um após o elemento final da sequência remanescente livre do valor especificado.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
A ordem dos elementos não removidos permanece estável.
O operator== usado para determinar a igualdade entre os elementos deve impor uma relação de equivalência entre seus operandos.
A complexidade é linear. Faz (last - first) comparações para a igualdade.
A list classe tem uma versão de função de membro mais eficiente do remove, que também revincula ponteiros.
Exemplo
// alg_remove.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1, Iter2, new_end;
int i;
for ( i = 0 ; i <= 9 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 0 ; ii <= 3 ; ii++ )
v1.push_back( 7 );
random_shuffle ( v1.begin( ), v1.end( ) );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Remove elements with a value of 7
new_end = remove ( v1.begin( ), v1.end( ), 7 );
cout << "Vector v1 with value 7 removed is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// To change the sequence size, use erase
v1.erase (new_end, v1.end( ) );
cout << "Vector v1 resized with value 7 removed is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
}
Vector v1 is ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
Vector v1 with value 7 removed is ( 4 0 5 1 6 9 3 8 2 9 3 7 8 2 ).
Vector v1 resized with value 7 removed is ( 4 0 5 1 6 9 3 8 2 ).
remove_copy
Copia elementos de um intervalo de origem para um intervalo de destino, exceto que os elementos de um valor especificado não são copiados, sem perturbar a ordem dos elementos restantes. Retorna o final de um novo intervalo de destino.
template<class InputIterator, class OutputIterator, class Type>
OutputIterator remove_copy(
InputIterator first,
InputIterator last,
OutputIterator result,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class Type>
ForwardIterator2 remove_copy(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result,
const Type& value);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que aborda a posição do primeiro elemento no intervalo do qual os elementos estão sendo removidos.
last
Um iterador de entrada abordando a posição um após o elemento final no intervalo do qual os elementos estão sendo removidos.
result
Um iterador de saída que aborda a posição do primeiro elemento no intervalo de destino para o qual os elementos estão sendo removidos.
value
O valor que deve ser removido do intervalo.
Valor de retorno
Um iterador de encaminhamento endereçando a nova posição final do intervalo de destino, um após o elemento final da cópia da sequência remanescente livre do valor especificado.
Observações
Os intervalos de origem e destino referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
Deve haver espaço suficiente no intervalo de destino para conter os elementos remanescentes que serão copiados depois que os elementos do valor especificado forem removidos.
A ordem dos elementos não removidos permanece estável.
O operator== usado para determinar a igualdade entre os elementos deve impor uma relação de equivalência entre seus operandos.
A complexidade é linear. Faz (last - first) comparações para igualdade e, no máximo, (last - first) atribuições.
Exemplo
// alg_remove_copy.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<int> v1, v2(10);
vector<int>::iterator Iter1, Iter2, new_end;
int i;
for ( i = 0 ; i <= 9 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 0 ; ii <= 3 ; ii++ )
v1.push_back( 7 );
random_shuffle (v1.begin( ), v1.end( ) );
cout << "The original vector v1 is: ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Remove elements with a value of 7
new_end = remove_copy ( v1.begin( ), v1.end( ), v2.begin( ), 7 );
cout << "Vector v1 is left unchanged as ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Vector v2 is a copy of v1 with the value 7 removed:\n ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
}
The original vector v1 is: ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
Vector v1 is left unchanged as ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
Vector v2 is a copy of v1 with the value 7 removed:
( 4 0 5 1 6 9 3 8 2 0 ).
remove_copy_if
Copia elementos de um intervalo de origem para um intervalo de destino, exceto para elementos que satisfazem um predicado. Os elementos são copiados sem perturbar a ordem dos elementos restantes. Retorna o final de um novo intervalo de destino.
template<class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator remove_copy_if(
InputIterator first,
InputIterator last,
OutputIterator result,
UnaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class UnaryPredicate>
ForwardIterator2 remove_copy_if(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result,
UnaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada que aborda a posição do primeiro elemento no intervalo do qual os elementos estão sendo removidos.
last
Um iterador de entrada abordando a posição um após o elemento final no intervalo do qual os elementos estão sendo removidos.
result
Um iterador de saída que aborda a posição do primeiro elemento no intervalo de destino para o qual os elementos estão sendo removidos.
pred
O predicado unário que deve ser satisfeito é o valor de um elemento a ser substituído.
Valor de retorno
Um iterador avançado que aborda a nova posição final do intervalo de destino, um após o elemento final da sequência remanescente livre dos elementos que satisfazem o predicado.
Observações
O intervalo de origem referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
Deve haver espaço suficiente no intervalo de destino para conter os elementos remanescentes que serão copiados depois que os elementos do valor especificado forem removidos.
A ordem dos elementos não removidos permanece estável.
O operator== usado para determinar a igualdade entre os elementos deve impor uma relação de equivalência entre seus operandos.
A complexidade é linear. Faz (last - first) comparações para igualdade e, no máximo, (last - first) atribuições.
Para obter informações sobre como essas funções se comportam, consulte Iteradores verificados.
Exemplo
// alg_remove_copy_if.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
bool greater6 ( int value ) {
return value > 6;
}
int main()
{
using namespace std;
vector<int> v1, v2(10);
vector<int>::iterator Iter1, Iter2, new_end;
int i;
for ( i = 0 ; i <= 9 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 0 ; ii <= 3 ; ii++ )
v1.push_back( 7 );
random_shuffle ( v1.begin( ), v1.end( ) );
cout << "The original vector v1 is: ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Remove elements with a value greater than 6
new_end = remove_copy_if ( v1.begin( ), v1.end( ),
v2.begin( ), greater6 );
cout << "After the appliation of remove_copy_if to v1,\n "
<< "vector v1 is left unchanged as ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Vector v2 is a copy of v1 with values greater "
<< "than 6 removed:\n ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != new_end ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
}
The original vector v1 is: ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
After the appliation of remove_copy_if to v1,
vector v1 is left unchanged as ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
Vector v2 is a copy of v1 with values greater than 6 removed:
( 4 0 5 1 6 3 2 ).
remove_if
Elimina elementos que satisfazem um predicado de um determinado intervalo sem perturbar a ordem dos elementos restantes. Retorna o final de um novo intervalo livre do valor especificado.
template<class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if(
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador avançado apontando para a posição do primeiro elemento no intervalo do qual os elementos estão sendo removidos.
last
Um iterador avançado apontando para a posição um após o elemento final no intervalo do qual os elementos estão sendo removidos.
pred
O predicado unário que deve ser satisfeito é o valor de um elemento a ser substituído.
Valor de retorno
Um iterador de encaminhamento endereçando a nova posição final do intervalo modificado, um após o elemento final da sequência remanescente livre do valor especificado.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
A ordem dos elementos não removidos permanece estável.
O operator== usado para determinar a igualdade entre os elementos deve impor uma relação de equivalência entre seus operandos.
A complexidade é linear. Faz (last - first) comparações para a igualdade.
List tem uma versão de função de membro mais eficiente de remover que revincula ponteiros.
Exemplo
// alg_remove_if.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
bool greater6 ( int value )
{
return value > 6;
}
int main()
{
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1, Iter2, new_end;
int i;
for ( i = 0 ; i <= 9 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 0 ; ii <= 3 ; ii++ )
v1.push_back( 7 );
random_shuffle ( v1.begin( ), v1.end( ) );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Remove elements satisfying predicate greater6
new_end = remove_if (v1.begin( ), v1.end( ), greater6 );
cout << "Vector v1 with elements satisfying greater6 removed is\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// To change the sequence size, use erase
v1.erase (new_end, v1.end( ) );
cout << "Vector v1 resized elements satisfying greater6 removed is\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
}
Vector v1 is ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
Vector v1 with elements satisfying greater6 removed is
( 4 0 5 1 6 3 2 1 6 9 3 7 8 2 ).
Vector v1 resized elements satisfying greater6 removed is
( 4 0 5 1 6 3 2 ).
replace
Examina cada elemento em um intervalo e o substitui se corresponder a um valor especificado.
template<class ForwardIterator, class Type>
void replace(
ForwardIterator first,
ForwardIterator last,
const Type& oldVal,
const Type& newVal);
template<class ExecutionPolicy, class ForwardIterator, class Type>
void replace(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
const Type& oldVal,
const Type& newVal);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador avançado apontando para a posição do primeiro elemento no intervalo a partir do qual os elementos estão sendo substituídos.
last
Um iterador avançado apontando para a posição um após o elemento final no intervalo a partir do qual os elementos estão sendo substituídos.
oldVal
O valor antigo dos elementos que estão sendo substituídos.
newVal
O novo valor sendo atribuído aos elementos com o valor antigo.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
A ordem dos elementos não substituídos permanece estável.
O operator== usado para determinar a igualdade entre os elementos deve impor uma relação de equivalência entre seus operandos.
A complexidade é linear. Faz (last - first) comparações para a igualdade e, no máximo, (last - first) atribuições de novos valores.
Exemplo
// alg_replace.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
std::vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for (int i = 0; i < 3; i++)
{
v.push_back(7);
}
std::cout << "The original vector v is:\n ( ";
for (auto iter = v.begin(); iter != v.end(); iter++)
{
std::cout << *iter << " ";
}
std::cout << ")." << std::endl;
// Replace elements with a value of 7 with a value of 700
replace(v.begin(), v.end(), 7, 700);
std::cout << "The vector v with 7s replaced with 700s:\n ( ";
for (auto iter = v.begin(); iter != v.end(); iter++)
{
std::cout << *iter << " ";
}
std::cout << ")." << std::endl;
}
The original vector v is:
( 0 1 2 3 4 5 6 7 8 9 7 7 7 ).
The vector v with 7s replaced with 700s:
( 0 1 2 3 4 5 6 700 8 9 700 700 700 ).
replace_copy
Examina cada elemento em um intervalo de origem e o substitui se corresponder a um valor especificado enquanto copia o resultado para um novo intervalo de destino.
template<class InputIterator, class OutputIterator, class Type>
OutputIterator replace_copy(
InputIterator first,
InputIterator last,
OutputIterator result,
const Type& oldVal,
const Type& newVal);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class Type>
ForwardIterator2 replace_copy(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result,
const Type& oldVal,
const Type& newVal);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada apontando para a posição do primeiro elemento no intervalo a partir do qual os elementos estão sendo substituídos.
last
Um iterador de entrada apontando para a posição um após o elemento final no intervalo a partir do qual os elementos estão sendo substituídos.
result
Um iterador de saída apontando para o primeiro elemento no intervalo de destino para onde a sequência alterada de elementos está sendo copiada.
oldVal
O valor antigo dos elementos que estão sendo substituídos.
newVal
O novo valor sendo atribuído aos elementos com o valor antigo.
Valor de retorno
Um iterador de saída apontando para a posição um após o elemento final no intervalo de destino para o qual a sequência alterada de elementos é copiada.
Observações
Os intervalos de origem e destino referenciados não devem sobrepor-se e ambos devem ser válidos: todos os ponteiros devem ser desreferenciados e, dentro das sequências, a última posição é alcançável a partir da primeira por incremento.
A ordem dos elementos não substituídos permanece estável.
O operator== usado para determinar a igualdade entre os elementos deve impor uma relação de equivalência entre seus operandos.
A complexidade é linear. Faz (last - first) comparações para a igualdade e, no máximo, (last - first) atribuições de novos valores.
Exemplo
// alg_replace_copy.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<int> theVector;
list<int> theList(15);
for (int i = 0; i <= 9; i++)
{
theVector.push_back(i);
}
for (int i = 0; i <= 3; i++)
{
theVector.push_back(7);
}
random_shuffle(theVector.begin(), theVector.end());
for (int i = 0; i <= 15; i++)
{
theVector.push_back(1);
}
cout << "The shuffled vector:\n ( ";
for (auto iter = theVector.begin(); iter != theVector.end(); iter++)
{
cout << *iter << " ";
}
cout << ")." << endl;
// Replace the 7s in part of the vector with 70s
// and copy into another part of the vector
replace_copy(theVector.begin(), theVector.begin() + 14, theVector.end() - 15, 7, 70);
cout << "The vector with instances of 7 replaced with 70 starting at position 14:\n ( ";
for (auto iter = theVector.begin(); iter != theVector.end(); iter++)
{
cout << *iter << " ";
}
cout << ")." << endl;
// Replace 7s found in the first 14 positions in the vector with 1s and then copy the result into a list
replace_copy(theVector.begin(), theVector.begin() + 14, theList.begin(), 7, 1);
cout << "List containing the contents of the vector but 7s replaced with 1s.\n ( ";
for (auto iter = theList.begin(); iter != theList.end(); iter++)
{
cout << *iter << " ";
}
cout << ")." << endl;
}
Devido à random_shuffle() chamada no código anterior, sua saída pode ser diferente.
The shuffled vector:
( 7 1 9 2 0 7 7 3 4 6 8 5 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ).
The vector with instances of 7 replaced with 70 starting at position 14:
( 7 1 9 2 0 7 7 3 4 6 8 5 7 7 1 70 1 9 2 0 70 70 3 4 6 8 5 70 70 1 ).
List containing the contents of the vector but 7s replaced with 1s.
( 1 1 9 2 0 1 1 3 4 6 8 5 1 1 0 ).
replace_copy_if
Examina cada elemento em um intervalo de origem e o substitui se ele satisfizer um predicado especificado enquanto copia o resultado para um novo intervalo de destino.
template<class InputIterator, class OutputIterator, class UnaryPredicate, class Type>
OutputIterator replace_copy_if(
InputIterator first,
InputIterator last,
OutputIterator result,
UnaryPredicate pred,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class UnaryPredicate, class Type>
ForwardIterator2 replace_copy_if(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result,
UnaryPredicate pred,
const Type& value);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de entrada apontando para a posição do primeiro elemento no intervalo a partir do qual os elementos estão sendo substituídos.
last
Um iterador de entrada apontando para a posição um após o elemento final no intervalo a partir do qual os elementos estão sendo substituídos.
result
Um iterador de saída apontando para a posição do primeiro elemento no intervalo de destino para o qual os elementos estão sendo copiados.
pred
O predicado unário que deve ser satisfeito é o valor de um elemento a ser substituído.
value
O novo valor sendo atribuído aos elementos cujo valor antigo satisfaz o predicado.
Valor de retorno
Um iterador de saída apontando para a posição um após o elemento final no intervalo de destino para o qual a sequência alterada de elementos é copiada.
Observações
Os intervalos de origem e destino referenciados não devem sobrepor-se e ambos devem ser válidos: todos os ponteiros devem ser desreferenciados e, dentro das sequências, a última posição é alcançável a partir da primeira por incremento.
A ordem dos elementos não substituídos permanece estável.
O operator== usado para determinar a igualdade entre os elementos deve impor uma relação de equivalência entre seus operandos.
A complexidade é linear. Faz (last - first) comparações para a igualdade e, no máximo, (last - first) atribuições de novos valores.
Exemplo
// alg_replace_copy_if.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
bool greater6 ( int value )
{
return value > 6;
}
int main()
{
using namespace std;
vector<int> v1;
list<int> L1 (13);
vector<int>::iterator Iter1;
list<int>::iterator L_Iter1;
int i;
for ( i = 0 ; i <= 9 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 0 ; ii <= 3 ; ii++ )
v1.push_back( 7 );
random_shuffle ( v1.begin( ), v1.end( ) );
int iii;
for ( iii = 0 ; iii <= 13 ; iii++ )
v1.push_back( 1 );
cout << "The original vector v1 is:\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Replace elements with a value of 7 in the 1st half of a vector
// with a value of 70 and copy it into the 2nd half of the vector
replace_copy_if ( v1.begin( ), v1.begin( ) + 14,v1.end( ) -14,
greater6 , 70);
cout << "The vector v1 with values of 70 replacing those greater"
<< "\n than 6 in the 1st half & copied into the 2nd half is:\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Replace elements in a vector with a value of 70
// with a value of 1 and copy into a list
replace_copy_if ( v1.begin( ), v1.begin( ) + 13,L1.begin( ),
greater6 , -1 );
cout << "A list copy of vector v1 with the value -1\n replacing "
<< "those greater than 6 is:\n ( " ;
for ( L_Iter1 = L1.begin( ) ; L_Iter1 != L1.end( ) ; L_Iter1++ )
cout << *L_Iter1 << " ";
cout << ")." << endl;
}
The original vector v1 is:
( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
The vector v1 with values of 70 replacing those greater
than 6 in the 1st half & copied into the 2nd half is:
( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
A list copy of vector v1 with the value -1
replacing those greater than 6 is:
( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
replace_if
Examina cada elemento em um intervalo e o substitui se ele satisfizer um predicado especificado.
template<class ForwardIterator, class UnaryPredicate, class Type>
void replace_if(
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator, class UnaryPredicate, class Type>
void replace_if(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred,
const Type& value);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador avançado apontando para a posição do primeiro elemento no intervalo a partir do qual os elementos estão sendo substituídos.
last
Um iterador apontando para a posição um após o elemento final no intervalo a partir do qual os elementos estão sendo substituídos.
pred
O predicado unário que deve ser satisfeito é o valor de um elemento a ser substituído.
value
O novo valor sendo atribuído aos elementos cujo valor antigo satisfaz o predicado.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
A ordem dos elementos não substituídos permanece estável.
O algoritmo replace_if é uma generalização do algoritmo replace, permitindo que qualquer predicado seja especificado, em vez de igualdade para um valor constante especificado.
O operator== usado para determinar a igualdade entre os elementos deve impor uma relação de equivalência entre seus operandos.
A complexidade é linear. Faz (last - first) comparações para a igualdade e, no máximo, (last - first) atribuições de novos valores.
Exemplo
// alg_replace_if.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
bool greater6(int value)
{
return value > 6;
}
int main()
{
using namespace std;
vector<int> v;
for (int i = 0; i <= 10; i++)
{
v.push_back(i);
}
cout << "The original vector v:\n ( ";
for (auto iter = v.begin(); iter != v.end(); iter++)
{
cout << *iter << " ";
}
cout << ")." << endl;
// Replace elements satisfying the predicate greater6
// with a value of 70
replace_if(v.begin(), v.end(), greater6, 70);
cout << "The vector v with a value 70 replacing those\n "
<< "elements satisfying the greater6 predicate is:\n ( ";
for (auto iter = v.begin(); iter != v.end(); iter++)
{
cout << *iter << " ";
}
cout << ").";
}
The original vector v:
( 0 1 2 3 4 5 6 7 8 9 10 ).
The vector v with a value 70 replacing those
elements satisfying the greater6 predicate is:
( 0 1 2 3 4 5 6 70 70 70 70 ).
reverse
Inverte a ordem dos elementos dentro de um intervalo.
template<class BidirectionalIterator>
void reverse(
BidirectionalIterator first,
BidirectionalIterator last);
template<class ExecutionPolicy, class BidirectionalIterator>
void reverse(
ExecutionPolicy&& exec,
BidirectionalIterator first,
BidirectionalIterator last);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador bidirecional apontando para a posição do primeiro elemento no intervalo dentro do qual os elementos estão sendo permutados.
last
Um iterador bidirecional apontando para a posição um após o elemento final no intervalo dentro do qual os elementos estão sendo permutados.
Observações
O intervalo de origem referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
Exemplo
// alg_reverse.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1;
int i;
for ( i = 0 ; i <= 9 ; i++ )
{
v1.push_back( i );
}
cout << "The original vector v1 is:\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Reverse the elements in the vector
reverse (v1.begin( ), v1.end( ) );
cout << "The modified vector v1 with values reversed is:\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
}
The original vector v1 is:
( 0 1 2 3 4 5 6 7 8 9 ).
The modified vector v1 with values reversed is:
( 9 8 7 6 5 4 3 2 1 0 ).
reverse_copy
Inverte a ordem dos elementos dentro de um intervalo de origem enquanto os copia para um intervalo de destino
template<class BidirectionalIterator, class OutputIterator>
OutputIterator reverse_copy(
BidirectionalIterator first,
BidirectionalIterator last,
OutputIterator result);
template<class ExecutionPolicy, class BidirectionalIterator, class ForwardIterator>
ForwardIterator reverse_copy(
ExecutionPolicy&& exec,
BidirectionalIterator first,
BidirectionalIterator last,
ForwardIterator result);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador bidirecional apontando para a posição do primeiro elemento no intervalo de origem dentro do qual os elementos estão sendo permutados.
last
Um iterador bidirecional apontando para a posição um após o elemento final no intervalo de origem dentro do qual os elementos estão sendo permutados.
result
Um iterador de saída apontando para a posição do primeiro elemento no intervalo de destino para o qual os elementos estão sendo copiados.
Valor de retorno
Um iterador de saída apontando para a posição um após o elemento final no intervalo de destino para o qual a sequência alterada de elementos é copiada.
Observações
Os intervalos de origem e destino referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
Exemplo
// alg_reverse_copy.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<int> v1, v2( 10 );
vector<int>::iterator Iter1, Iter2;
int i;
for ( i = 0 ; i <= 9 ; i++ )
{
v1.push_back( i );
}
cout << "The original vector v1 is:\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Reverse the elements in the vector
reverse_copy (v1.begin( ), v1.end( ), v2.begin( ) );
cout << "The copy v2 of the reversed vector v1 is:\n ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
cout << "The original vector v1 remains unmodified as:\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
}
The original vector v1 is:
( 0 1 2 3 4 5 6 7 8 9 ).
The copy v2 of the reversed vector v1 is:
( 9 8 7 6 5 4 3 2 1 0 ).
The original vector v1 remains unmodified as:
( 0 1 2 3 4 5 6 7 8 9 ).
rotate
Troca os elementos em dois intervalos adjacentes.
template<class ForwardIterator>
void rotate(
ForwardIterator first,
ForwardIterator middle,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator>
ForwardIterator rotate(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator middle,
ForwardIterator last);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador avançado abordando a posição do primeiro elemento no intervalo a ser girado.
middle
Um iterador avançado que define o limite dentro do intervalo que aborda a posição do primeiro elemento na segunda parte do intervalo cujos elementos devem ser trocados com os da primeira parte do intervalo.
last
Um iterador avançado que aborda a posição um após o elemento final no intervalo a ser girado.
Observações
Os intervalos referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
A complexidade é linear. Faz no máximo (last - first) swaps.
Exemplo
// alg_rotate.cpp
// compile with: /EHsc
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
int main() {
using namespace std;
vector<int> v1;
deque<int> d1;
vector<int>::iterator v1Iter1;
deque<int>::iterator d1Iter1;
int i;
for ( i = -3 ; i <= 5 ; i++ )
{
v1.push_back( i );
}
int ii;
for ( ii =0 ; ii <= 5 ; ii++ )
{
d1.push_back( ii );
}
cout << "Vector v1 is ( " ;
for ( v1Iter1 = v1.begin( ) ; v1Iter1 != v1.end( ) ;v1Iter1 ++ )
cout << *v1Iter1 << " ";
cout << ")." << endl;
rotate ( v1.begin( ), v1.begin( ) + 3 , v1.end( ) );
cout << "After rotating, vector v1 is ( " ;
for ( v1Iter1 = v1.begin( ) ; v1Iter1 != v1.end( ) ;v1Iter1 ++ )
cout << *v1Iter1 << " ";
cout << ")." << endl;
cout << "The original deque d1 is ( " ;
for ( d1Iter1 = d1.begin( ) ; d1Iter1 != d1.end( ) ;d1Iter1 ++ )
cout << *d1Iter1 << " ";
cout << ")." << endl;
int iii = 1;
while ( iii <= d1.end( ) - d1.begin( ) ) {
rotate ( d1.begin( ), d1.begin( ) + 1 , d1.end( ) );
cout << "After the rotation of a single deque element to the back,\n d1 is ( " ;
for ( d1Iter1 = d1.begin( ) ; d1Iter1 != d1.end( ) ;d1Iter1 ++ )
cout << *d1Iter1 << " ";
cout << ")." << endl;
iii++;
}
}
Vector v1 is ( -3 -2 -1 0 1 2 3 4 5 ).
After rotating, vector v1 is ( 0 1 2 3 4 5 -3 -2 -1 ).
The original deque d1 is ( 0 1 2 3 4 5 ).
After the rotation of a single deque element to the back,
d1 is ( 1 2 3 4 5 0 ).
After the rotation of a single deque element to the back,
d1 is ( 2 3 4 5 0 1 ).
After the rotation of a single deque element to the back,
d1 is ( 3 4 5 0 1 2 ).
After the rotation of a single deque element to the back,
d1 is ( 4 5 0 1 2 3 ).
After the rotation of a single deque element to the back,
d1 is ( 5 0 1 2 3 4 ).
After the rotation of a single deque element to the back,
d1 is ( 0 1 2 3 4 5 ).
rotate_copy
Troca os elementos em dois intervalos adjacentes dentro de um intervalo de origem e copia o resultado para um intervalo de destino.
template<class ForwardIterator, class OutputIterator>
OutputIterator rotate_copy(
ForwardIterator first,
ForwardIterator middle,
ForwardIterator last,
OutputIterator result );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 rotate_copy(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 middle,
ForwardIterator1 last,
ForwardIterator2 result);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador avançado abordando a posição do primeiro elemento no intervalo a ser girado.
middle
Um iterador avançado que define o limite dentro do intervalo que aborda a posição do primeiro elemento na segunda parte do intervalo cujos elementos devem ser trocados com os da primeira parte do intervalo.
last
Um iterador avançado que aborda a posição um após o elemento final no intervalo a ser girado.
result
Um iterador de saída que aborda a posição do primeiro elemento no intervalo de destino.
Valor de retorno
Um iterador de saída endereçando a posição um após o elemento final no intervalo de destino.
Observações
Os intervalos referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
A complexidade é linear. Faz no máximo (last - first) swaps.
Exemplo
// alg_rotate_copy.cpp
// compile with: /EHsc
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<int> v1 , v2 ( 9 );
deque<int> d1 , d2 ( 6 );
vector<int>::iterator v1Iter , v2Iter;
deque<int>::iterator d1Iter , d2Iter;
int i;
for ( i = -3 ; i <= 5 ; i++ )
v1.push_back( i );
int ii;
for ( ii =0 ; ii <= 5 ; ii++ )
d1.push_back( ii );
cout << "Vector v1 is ( " ;
for ( v1Iter = v1.begin( ) ; v1Iter != v1.end( ) ;v1Iter ++ )
cout << *v1Iter << " ";
cout << ")." << endl;
rotate_copy ( v1.begin( ), v1.begin( ) + 3 , v1.end( ), v2.begin( ) );
cout << "After rotating, the vector v1 remains unchanged as:\n v1 = ( " ;
for ( v1Iter = v1.begin( ) ; v1Iter != v1.end( ) ;v1Iter ++ )
cout << *v1Iter << " ";
cout << ")." << endl;
cout << "After rotating, the copy of vector v1 in v2 is:\n v2 = ( " ;
for ( v2Iter = v2.begin( ) ; v2Iter != v2.end( ) ;v2Iter ++ )
cout << *v2Iter << " ";
cout << ")." << endl;
cout << "The original deque d1 is ( " ;
for ( d1Iter = d1.begin( ) ; d1Iter != d1.end( ) ;d1Iter ++ )
cout << *d1Iter << " ";
cout << ")." << endl;
int iii = 1;
while ( iii <= d1.end( ) - d1.begin( ) )
{
rotate_copy ( d1.begin( ), d1.begin( ) + iii , d1.end( ), d2.begin( ) );
cout << "After the rotation of a single deque element to the back,\n d2 is ( " ;
for ( d2Iter = d2.begin( ) ; d2Iter != d2.end( ) ;d2Iter ++ )
cout << *d2Iter << " ";
cout << ")." << endl;
iii++;
}
}
Vector v1 is ( -3 -2 -1 0 1 2 3 4 5 ).
After rotating, the vector v1 remains unchanged as:
v1 = ( -3 -2 -1 0 1 2 3 4 5 ).
After rotating, the copy of vector v1 in v2 is:
v2 = ( 0 1 2 3 4 5 -3 -2 -1 ).
The original deque d1 is ( 0 1 2 3 4 5 ).
After the rotation of a single deque element to the back,
d2 is ( 1 2 3 4 5 0 ).
After the rotation of a single deque element to the back,
d2 is ( 2 3 4 5 0 1 ).
After the rotation of a single deque element to the back,
d2 is ( 3 4 5 0 1 2 ).
After the rotation of a single deque element to the back,
d2 is ( 4 5 0 1 2 3 ).
After the rotation of a single deque element to the back,
d2 is ( 5 0 1 2 3 4 ).
After the rotation of a single deque element to the back,
d2 is ( 0 1 2 3 4 5 ).
sample
template<class PopulationIterator, class SampleIterator, class Distance, class UniformRandomBitGenerator>
SampleIterator sample(
PopulationIterator first,
PopulationIterator last,
SampleIterator out,
Distance n,
UniformRandomBitGenerator&& g);
search
Procura a primeira ocorrência de uma sequência dentro de um intervalo de destino cujos elementos são iguais aos de uma dada sequência de elementos ou cujos elementos são equivalentes num sentido especificado por um predicado binário aos elementos na sequência dada.
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 search(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 search(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
template <class ForwardIterator, class Searcher>
ForwardIterator search(
ForwardIterator first,
ForwardIterator last,
const Searcher& searcher);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador avançado que aborda a posição do primeiro elemento no intervalo a ser pesquisado.
last1
Um iterador avançado abordando a posição um após o elemento final no intervalo a ser pesquisado.
first2
Um iterador avançado abordando a posição do primeiro elemento no intervalo a ser correspondido.
last2
Um iterador avançado que aborda a posição um após o elemento final no intervalo a ser correspondido.
pred
Objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita se dois elementos devem ser tomados como equivalentes. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
searcher
O pesquisador que encapsula o padrão a ser procurado e o algoritmo de pesquisa a ser usado. Para obter mais informações sobre pesquisadores, consulte default_searcher classe, boyer_moore_horspool_searcher classe e boyer_moore_searcher classe.
Valor de retorno
Um iterador de encaminhamento que aborda a posição do primeiro elemento da primeira subsequência que corresponde à sequência especificada ou que é equivalente em um sentido especificado por um predicado binário.
Observações
O operator== usado para determinar a correspondência entre um elemento e o valor especificado deve impor uma relação de equivalência entre seus operandos.
Os intervalos referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição é alcançável a partir da primeira por incremento.
A complexidade média é linear em relação ao tamanho do intervalo pesquisado. A complexidade do pior caso também é linear em relação ao tamanho da sequência que está sendo pesquisada.
Exemplo
// alg_search.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
// Return whether second element is twice the first
bool twice (int elem1, int elem2 )
{
return 2 * elem1 == elem2;
}
int main()
{
using namespace std;
vector<int> v1, v2;
list<int> L1;
vector<int>::iterator Iter1, Iter2;
list<int>::iterator L1_Iter, L1_inIter;
int i;
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 5 * i );
}
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 5 * i );
}
int ii;
for ( ii = 4 ; ii <= 5 ; ii++ )
{
L1.push_back( 5 * ii );
}
int iii;
for ( iii = 2 ; iii <= 4 ; iii++ )
{
v2.push_back( 10 * iii );
}
cout << "Vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "List L1 = ( " ;
for ( L1_Iter = L1.begin( ) ; L1_Iter!= L1.end( ) ; L1_Iter++ )
cout << *L1_Iter << " ";
cout << ")" << endl;
cout << "Vector v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// Searching v1 for first match to L1 under identity
vector<int>::iterator result1;
result1 = search (v1.begin( ), v1.end( ), L1.begin( ), L1.end( ) );
if ( result1 == v1.end( ) )
cout << "There is no match of L1 in v1."
<< endl;
else
cout << "There is at least one match of L1 in v1"
<< "\n and the first one begins at "
<< "position "<< result1 - v1.begin( ) << "." << endl;
// Searching v1 for a match to L1 under the binary predicate twice
vector<int>::iterator result2;
result2 = search (v1.begin( ), v1.end( ), v2.begin( ), v2.end( ), twice );
if ( result2 == v1.end( ) )
cout << "There is no match of L1 in v1."
<< endl;
else
cout << "There is a sequence of elements in v1 that "
<< "are equivalent\n to those in v2 under the binary "
<< "predicate twice\n and the first one begins at position "
<< result2 - v1.begin( ) << "." << endl;
}
Vector v1 = ( 0 5 10 15 20 25 0 5 10 15 20 25 )
List L1 = ( 20 25 )
Vector v2 = ( 20 30 40 )
There is at least one match of L1 in v1
and the first one begins at position 4.
There is a sequence of elements in v1 that are equivalent
to those in v2 under the binary predicate twice
and the first one begins at position 2.
search_n
Procura a primeira subsequência em um intervalo de um número especificado de elementos com um valor particular ou uma relação com esse valor, conforme especificado por um predicado binário.
template<class ForwardIterator1, class Diff2, class Type>
ForwardIterator1 search_n(
ForwardIterator1 first1,
ForwardIterator1 last1,
Diff2 count,
const Type& value);
template<class ForwardIterator1, class Diff2, class Type, class BinaryPredicate>
ForwardIterator1 search_n(
ForwardIterator1 first1,
ForwardIterator1 last1,
Diff2 count,
const Type& value,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator, class Size, class Type>
ForwardIterator search_n(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Size count,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator, class Size, class Type, class BinaryPredicate>
ForwardIterator search_n(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Size count,
const Type& value,
BinaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador avançado que aborda a posição do primeiro elemento no intervalo a ser pesquisado.
last1
Um iterador avançado abordando a posição um após o elemento final no intervalo a ser pesquisado.
count
O tamanho da subsequência que está sendo pesquisada.
value
O valor dos elementos na sequência que está sendo pesquisada.
pred
Objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita se dois elementos devem ser tomados como equivalentes. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
Um iterador de encaminhamento que aborda a posição do primeiro elemento da primeira subsequência que corresponde à sequência especificada ou que é equivalente em um sentido especificado por um predicado binário.
Observações
O operator== usado para determinar a correspondência entre um elemento e o valor especificado deve impor uma relação de equivalência entre seus operandos.
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
A complexidade é linear em relação ao tamanho do pesquisado.
Exemplo
// alg_search_n.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
// Return whether second element is 1/2 of the first
bool one_half ( int elem1, int elem2 )
{
return elem1 == 2 * elem2;
}
int main()
{
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1;
int i;
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 5 * i );
}
for ( i = 0 ; i <= 2 ; i++ )
{
v1.push_back( 5 );
}
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 5 * i );
}
for ( i = 0 ; i <= 2 ; i++ )
{
v1.push_back( 10 );
}
cout << "Vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// Searching v1 for first match to (5 5 5) under identity
vector<int>::iterator result1;
result1 = search_n ( v1.begin( ), v1.end( ), 3, 5 );
if ( result1 == v1.end( ) )
cout << "There is no match for a sequence ( 5 5 5 ) in v1."
<< endl;
else
cout << "There is at least one match of a sequence ( 5 5 5 )"
<< "\n in v1 and the first one begins at "
<< "position "<< result1 - v1.begin( ) << "." << endl;
// Searching v1 for first match to (5 5 5) under one_half
vector<int>::iterator result2;
result2 = search_n (v1.begin( ), v1.end( ), 3, 5, one_half );
if ( result2 == v1.end( ) )
cout << "There is no match for a sequence ( 5 5 5 ) in v1"
<< " under the equivalence predicate one_half." << endl;
else
cout << "There is a match of a sequence ( 5 5 5 ) "
<< "under the equivalence\n predicate one_half "
<< "in v1 and the first one begins at "
<< "position "<< result2 - v1.begin( ) << "." << endl;
}
Vector v1 = ( 0 5 10 15 20 25 5 5 5 0 5 10 15 20 25 10 10 10 )
There is at least one match of a sequence ( 5 5 5 )
in v1 and the first one begins at position 6.
There is a match of a sequence ( 5 5 5 ) under the equivalence
predicate one_half in v1 and the first one begins at position 15.
set_difference
Unifica todos os elementos que pertencem a um intervalo de origem classificado, mas não a um segundo intervalo de origem classificado, em um único intervalo de destino classificado. Um predicado binário pode especificar o critério de ordenação.
template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result );
template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator set_difference(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result,
Compare pred );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator>
ForwardIterator set_difference(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator, class Compare>
ForwardIterator set_difference(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador de entrada abordando a posição do primeiro elemento no primeiro de dois intervalos de origem classificados a serem unidos e classificados em um único intervalo representando a diferença dos dois intervalos de origem.
last1
Um iterador de entrada abordando a posição um após o último elemento no primeiro de dois intervalos de origem classificados a serem unidos e classificados em um único intervalo representando a diferença dos dois intervalos de origem.
first2
Um iterador de entrada abordando a posição do primeiro elemento no segundo de dois intervalos de origem classificados consecutivos a serem unidos e classificados em um único intervalo representando a diferença dos dois intervalos de origem.
last2
Um iterador de entrada abordando a posição um após o último elemento no segundo de dois intervalos de origem classificados consecutivos a serem unidos e classificados em um único intervalo representando a diferença dos dois intervalos de origem.
result
Um iterador de saída que aborda a posição do primeiro elemento no intervalo de destino onde os dois intervalos de origem devem ser unidos em um único intervalo classificado representando a diferença dos dois intervalos de origem.
pred
Objeto de função de predicado definido pelo usuário que define o sentido em que um elemento é menor que outro. O predicado binário usa dois argumentos e deve retornar true quando o primeiro elemento é menor que o segundo elemento e false caso contrário.
Valor de retorno
Um iterador de saída endereçando a posição um após o último elemento no intervalo de destino classificado representando a diferença dos dois intervalos de origem.
Observações
Os intervalos de origem classificados referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição deve ser alcançável a partir da primeira por incremento.
O intervalo de destino não deve sobrepor-se a nenhum dos intervalos de origem e deve ser grande o suficiente para conter o primeiro intervalo de origem.
Os intervalos de fontes ordenadas devem ser organizados como uma pré-condição para a aplicação do set_difference algoritmo de acordo com a mesma ordenação que deve ser usada pelo algoritmo para classificar os intervalos combinados.
A operação é estável à medida que a ordem relativa dos elementos dentro de cada intervalo é preservada no intervalo de destino. Os intervalos de origem não são modificados pela mesclagem de algoritmos.
Os tipos de valor dos iteradores de entrada devem ser menores do que comparáveis para serem encomendados. Ou seja, dados dois elementos, você pode determinar que um é menor que o outro, ou que eles são equivalentes. (Aqui, equivalente significa que nenhum é menor que o outro.) Esta comparação resulta numa ordenação entre os elementos não equivalentes. Quando há elementos equivalentes em ambos os intervalos de origem, os elementos no primeiro intervalo precedem os elementos do segundo intervalo de origem no intervalo de destino. Se os intervalos de origem contiverem duplicatas de um elemento tal que haja mais no primeiro intervalo de origem do que no segundo, então o intervalo de destino conterá o número pelo qual as ocorrências desses elementos no primeiro intervalo de origem excedem as ocorrências desses elementos no segundo intervalo de origem.
A complexidade do algoritmo é linear com, no máximo 2 * ((last1 - first1) + (last2 - first2)) - 1 , comparações para intervalos de fontes não vazias.
Exemplo
// alg_set_diff.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser (int elem1, int elem2 )
{
if (elem1 < 0)
elem1 = - elem1;
if (elem2 < 0)
elem2 = - elem2;
return elem1 < elem2;
}
int main()
{
using namespace std;
vector<int> v1a, v1b, v1 ( 12 );
vector<int>::iterator Iter1a, Iter1b, Iter1, Result1;
// Constructing vectors v1a & v1b with default less-than ordering
int i;
for ( i = -1 ; i <= 4 ; i++ )
{
v1a.push_back( i );
}
int ii;
for ( ii =-3 ; ii <= 0 ; ii++ )
{
v1b.push_back( ii );
}
cout << "Original vector v1a with range sorted by the\n "
<< "binary predicate less than is v1a = ( " ;
for ( Iter1a = v1a.begin( ) ; Iter1a != v1a.end( ) ; Iter1a++ )
cout << *Iter1a << " ";
cout << ")." << endl;
cout << "Original vector v1b with range sorted by the\n "
<< "binary predicate less than is v1b = ( " ;
for ( Iter1b = v1b.begin( ) ; Iter1b != v1b.end( ) ; Iter1b++ )
cout << *Iter1b << " ";
cout << ")." << endl;
// Constructing vectors v2a & v2b with ranges sorted by greater
vector<int> v2a ( v1a ) , v2b ( v1b ) , v2 ( v1 );
vector<int>::iterator Iter2a, Iter2b, Iter2, Result2;
sort ( v2a.begin( ), v2a.end( ), greater<int>( ) );
sort ( v2b.begin( ), v2b.end( ), greater<int>( ) );
cout << "Original vector v2a with range sorted by the\n "
<< "binary predicate greater is v2a = ( " ;
for ( Iter2a = v2a.begin( ) ; Iter2a != v2a.end( ) ; Iter2a++ )
cout << *Iter2a << " ";
cout << ")." << endl;
cout << "Original vector v2b with range sorted by the\n "
<< "binary predicate greater is v2b = ( " ;
for ( Iter2b = v2b.begin( ) ; Iter2b != v2b.end( ) ; Iter2b++ )
cout << *Iter2b << " ";
cout << ")." << endl;
// Constructing vectors v3a & v3b with ranges sorted by mod_lesser
vector<int> v3a ( v1a ), v3b ( v1b ) , v3 ( v1 );
vector<int>::iterator Iter3a, Iter3b, Iter3, Result3;
sort ( v3a.begin( ), v3a.end( ), mod_lesser );
sort ( v3b.begin( ), v3b.end( ), mod_lesser );
cout << "Original vector v3a with range sorted by the\n "
<< "binary predicate mod_lesser is v3a = ( " ;
for ( Iter3a = v3a.begin( ) ; Iter3a != v3a.end( ) ; Iter3a++ )
cout << *Iter3a << " ";
cout << ")." << endl;
cout << "Original vector v3b with range sorted by the\n "
<< "binary predicate mod_lesser is v3b = ( " ;
for ( Iter3b = v3b.begin( ) ; Iter3b != v3b.end( ) ; Iter3b++ )
cout << *Iter3b << " ";
cout << ")." << endl;
// To combine into a difference in asscending
// order with the default binary predicate less<int>( )
Result1 = set_difference ( v1a.begin( ), v1a.end( ),
v1b.begin( ), v1b.end( ), v1.begin( ) );
cout << "Set_difference of source ranges with default order,"
<< "\n vector v1mod = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != Result1 ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// To combine into a difference in descending
// order specify binary predicate greater<int>( )
Result2 = set_difference ( v2a.begin( ), v2a.end( ),
v2b.begin( ), v2b.end( ),v2.begin( ), greater<int>( ) );
cout << "Set_difference of source ranges with binary"
<< "predicate greater specified,\n vector v2mod = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != Result2 ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
// To combine into a difference applying a user
// defined binary predicate mod_lesser
Result3 = set_difference ( v3a.begin( ), v3a.end( ),
v3b.begin( ), v3b.end( ), v3.begin( ), mod_lesser );
cout << "Set_difference of source ranges with binary "
<< "predicate mod_lesser specified,\n vector v3mod = ( " ; ;
for ( Iter3 = v3.begin( ) ; Iter3 != Result3 ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
}
Original vector v1a with range sorted by the
binary predicate less than is v1a = ( -1 0 1 2 3 4 ).
Original vector v1b with range sorted by the
binary predicate less than is v1b = ( -3 -2 -1 0 ).
Original vector v2a with range sorted by the
binary predicate greater is v2a = ( 4 3 2 1 0 -1 ).
Original vector v2b with range sorted by the
binary predicate greater is v2b = ( 0 -1 -2 -3 ).
Original vector v3a with range sorted by the
binary predicate mod_lesser is v3a = ( 0 -1 1 2 3 4 ).
Original vector v3b with range sorted by the
binary predicate mod_lesser is v3b = ( 0 -1 -2 -3 ).
Set_difference of source ranges with default order,
vector v1mod = ( 1 2 3 4 ).
Set_difference of source ranges with binarypredicate greater specified,
vector v2mod = ( 4 3 2 1 ).
Set_difference of source ranges with binary predicate mod_lesser specified,
vector v3mod = ( 1 4 ).
set_intersection
Unifica todos os elementos que pertencem a ambos os intervalos de origem classificados em um único intervalo de destino classificado, onde o critério de ordenação pode ser especificado por um predicado binário.
template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result);
template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator set_intersection(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result,
Compare pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator>
ForwardIterator set_intersection(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator, class Compare>
ForwardIterator set_intersection(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador de entrada abordando a posição do primeiro elemento no primeiro de dois intervalos de origem classificados a serem unidos e classificados em um único intervalo representando a interseção dos dois intervalos de origem.
last1
Um iterador de entrada abordando a posição um após o último elemento no primeiro de dois intervalos de origem classificados a ser unido e classificado em um único intervalo que representa a interseção dos dois intervalos de origem.
first2
Um iterador de entrada abordando a posição do primeiro elemento no segundo de dois intervalos de origem classificados consecutivos a serem unidos e classificados em um único intervalo representando a interseção dos dois intervalos de origem.
last2
Um iterador de entrada abordando a posição um após o último elemento no segundo de dois intervalos de origem classificados consecutivos a serem unidos e classificados em um único intervalo representando a interseção dos dois intervalos de origem.
result
Um iterador de saída que aborda a posição do primeiro elemento no intervalo de destino onde os dois intervalos de origem devem ser unidos em um único intervalo classificado representando a interseção dos dois intervalos de origem.
pred
Objeto de função de predicado definido pelo usuário que define o sentido em que um elemento é menor que outro. O predicado binário usa dois argumentos e deve retornar true quando o primeiro elemento é menor que o segundo elemento e false caso contrário.
Valor de retorno
Um iterador de saída que aborda a posição um após o último elemento no intervalo de destino classificado que representa a interseção dos dois intervalos de origem.
Observações
Os intervalos de origem classificados referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição deve ser alcançável a partir da primeira por incremento.
O intervalo de destino não deve sobrepor-se a nenhum dos intervalos de origem e deve ser grande o suficiente para conter o intervalo de destino.
Os intervalos de origem classificados devem ser organizados como uma pré-condição para a aplicação do algoritmo de mesclagem de acordo com a mesma ordem que deve ser usada pelo algoritmo para classificar os intervalos combinados.
A operação é estável à medida que a ordem relativa dos elementos dentro de cada intervalo é preservada no intervalo de destino. Os intervalos de origem não são modificados pelo algoritmo.
Os tipos de valor dos iteradores de entrada devem ser menores do que comparáveis para serem encomendados. Ou seja, dados dois elementos, você pode determinar que um é menor que o outro, ou que eles são equivalentes. (Aqui, equivalente significa que nenhum é menor que o outro.) Esta comparação resulta numa ordenação entre os elementos não equivalentes. Quando há elementos equivalentes em ambos os intervalos de origem, os elementos no primeiro intervalo precedem os elementos do segundo intervalo de origem no intervalo de destino. Se os intervalos de origem contiverem duplicatas de um elemento, o intervalo de destino conterá o número máximo desses elementos que ocorrem em ambos os intervalos de origem.
A complexidade do algoritmo é linear com, no máximo 2 * ((last1 - first1) + (last2 - first2)) - 1 , comparações para intervalos de fontes não vazias.
Exemplo
// alg_set_intersection.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser (int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
}
int main()
{
using namespace std;
vector<int> v1a, v1b, v1 ( 12 );
vector<int>::iterator Iter1a, Iter1b, Iter1, Result1;
// Constructing vectors v1a & v1b with default less than ordering
int i;
for ( i = -1 ; i <= 3 ; i++ )
v1a.push_back( i );
int ii;
for ( ii =-3 ; ii <= 1 ; ii++ )
v1b.push_back( ii );
cout << "Original vector v1a with range sorted by the\n "
<< "binary predicate less than is v1a = ( " ;
for ( Iter1a = v1a.begin( ) ; Iter1a != v1a.end( ) ; Iter1a++ )
cout << *Iter1a << " ";
cout << ")." << endl;
cout << "Original vector v1b with range sorted by the\n "
<< "binary predicate less than is v1b = ( " ;
for ( Iter1b = v1b.begin( ) ; Iter1b != v1b.end( ) ; Iter1b++ )
cout << *Iter1b << " ";
cout << ")." << endl;
// Constructing vectors v2a & v2b with ranges sorted by greater
vector<int> v2a ( v1a ) , v2b ( v1b ) , v2 ( v1 );
vector<int>::iterator Iter2a, Iter2b, Iter2, Result2;
sort ( v2a.begin( ), v2a.end( ), greater<int>( ) );
sort ( v2b.begin( ), v2b.end( ), greater<int>( ) );
cout << "Original vector v2a with range sorted by the\n "
<< "binary predicate greater is v2a = ( " ;
for ( Iter2a = v2a.begin( ) ; Iter2a != v2a.end( ) ; Iter2a++ )
cout << *Iter2a << " ";
cout << ")." << endl;
cout << "Original vector v2b with range sorted by the\n "
<< "binary predicate greater is v2b = ( " ;
for ( Iter2b = v2b.begin( ) ; Iter2b != v2b.end( ) ; Iter2b++ )
cout << *Iter2b << " ";
cout << ")." << endl;
// Constructing vectors v3a & v3b with ranges sorted by mod_lesser
vector<int> v3a ( v1a ), v3b ( v1b ) , v3 ( v1 );
vector<int>::iterator Iter3a, Iter3b, Iter3, Result3;
sort ( v3a.begin( ), v3a.end( ), mod_lesser );
sort ( v3b.begin( ), v3b.end( ), mod_lesser );
cout << "Original vector v3a with range sorted by the\n "
<< "binary predicate mod_lesser is v3a = ( " ;
for ( Iter3a = v3a.begin( ) ; Iter3a != v3a.end( ) ; Iter3a++ )
cout << *Iter3a << " ";
cout << ")." << endl;
cout << "Original vector v3b with range sorted by the\n "
<< "binary predicate mod_lesser is v3b = ( " ;
for ( Iter3b = v3b.begin( ) ; Iter3b != v3b.end( ) ; Iter3b++ )
cout << *Iter3b << " ";
cout << ")." << endl;
// To combine into an intersection in asscending order with the
// default binary predicate less<int>( )
Result1 = set_intersection ( v1a.begin( ), v1a.end( ),
v1b.begin( ), v1b.end( ), v1.begin( ) );
cout << "Intersection of source ranges with default order,"
<< "\n vector v1mod = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != Result1 ; ++Iter1 )
cout << *Iter1 << " ";
cout << ")." << endl;
// To combine into an intersection in descending order, specify
// binary predicate greater<int>( )
Result2 = set_intersection ( v2a.begin( ), v2a.end( ),
v2b.begin( ), v2b.end( ),v2.begin( ), greater<int>( ) );
cout << "Intersection of source ranges with binary predicate"
<< " greater specified,\n vector v2mod = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != Result2 ; ++Iter2 )
cout << *Iter2 << " ";
cout << ")." << endl;
// To combine into an intersection applying a user-defined
// binary predicate mod_lesser
Result3 = set_intersection ( v3a.begin( ), v3a.end( ),
v3b.begin( ), v3b.end( ), v3.begin( ), mod_lesser );
cout << "Intersection of source ranges with binary predicate "
<< "mod_lesser specified,\n vector v3mod = ( " ; ;
for ( Iter3 = v3.begin( ) ; Iter3 != Result3 ; ++Iter3 )
cout << *Iter3 << " ";
cout << ")." << endl;
}
Original vector v1a with range sorted by the
binary predicate less than is v1a = ( -1 0 1 2 3 ).
Original vector v1b with range sorted by the
binary predicate less than is v1b = ( -3 -2 -1 0 1 ).
Original vector v2a with range sorted by the
binary predicate greater is v2a = ( 3 2 1 0 -1 ).
Original vector v2b with range sorted by the
binary predicate greater is v2b = ( 1 0 -1 -2 -3 ).
Original vector v3a with range sorted by the
binary predicate mod_lesser is v3a = ( 0 -1 1 2 3 ).
Original vector v3b with range sorted by the
binary predicate mod_lesser is v3b = ( 0 -1 1 -2 -3 ).
Intersection of source ranges with default order,
vector v1mod = ( -1 0 1 ).
Intersection of source ranges with binary predicate greater specified,
vector v2mod = ( 1 0 -1 ).
Intersection of source ranges with binary predicate mod_lesser specified,
vector v3mod = ( 0 -1 1 2 3 ).
set_symmetric_difference
Unifica todos os elementos que pertencem a um, mas não a ambos, dos intervalos de origem classificados em um único intervalo de destino classificado. Um predicado binário pode especificar o critério de ordenação.
template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_symmetric_difference(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result );
template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator set_symmetric_difference(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result,
Compare pred );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator>
ForwardIterator set_symmetric_difference(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator, class Compare>
ForwardIterator set_symmetric_difference(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador de entrada que aborda a posição do primeiro elemento no primeiro de dois intervalos de origem classificados a serem unidos e classificados em um único intervalo representando a diferença simétrica dos dois intervalos de origem.
last1
Um iterador de entrada que aborda a posição um após o último elemento no primeiro de dois intervalos de origem classificados a serem unidos e classificados em um único intervalo que representa a diferença simétrica dos dois intervalos de origem.
first2
Um iterador de entrada que aborda a posição do primeiro elemento no segundo de dois intervalos de origem classificados consecutivos a serem unidos e classificados em um único intervalo representando a diferença simétrica dos dois intervalos de origem.
last2
Um iterador de entrada abordando a posição um após o último elemento no segundo de dois intervalos de origem classificados consecutivos a serem unidos e classificados em um único intervalo representando a diferença simétrica dos dois intervalos de origem.
result
Um iterador de saída que aborda a posição do primeiro elemento no intervalo de destino onde os dois intervalos de origem devem ser unidos em um único intervalo classificado representando a diferença simétrica dos dois intervalos de origem.
pred
Objeto de função de predicado definido pelo usuário que define o sentido em que um elemento é menor que outro. O predicado binário usa dois argumentos e deve retornar true quando o primeiro elemento é menor que o segundo elemento e false caso contrário.
Valor de retorno
Um iterador de saída que aborda a posição um após o último elemento no intervalo de destino classificado que representa a diferença simétrica dos dois intervalos de origem.
Observações
Os intervalos de origem classificados referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição deve ser alcançável a partir da primeira por incremento.
O intervalo de destino não deve sobrepor-se a nenhum dos intervalos de origem e deve ser grande o suficiente para conter o intervalo de destino.
Os intervalos de fontes ordenadas devem ser organizados como uma pré-condição para a aplicação do merge* algoritmo de acordo com a mesma ordenação que deve ser usada pelo algoritmo para classificar os intervalos combinados.
A operação é estável à medida que a ordem relativa dos elementos dentro de cada intervalo é preservada no intervalo de destino. Os intervalos de origem não são modificados pela mesclagem de algoritmos.
Os tipos de valor dos iteradores de entrada devem ser menores do que comparáveis para serem encomendados. Ou seja, dados dois elementos, você pode determinar que um é menor que o outro, ou que eles são equivalentes. (Aqui, equivalente significa que nenhum é menor que o outro.) Esta comparação resulta numa ordenação entre os elementos não equivalentes. Quando há elementos equivalentes em ambos os intervalos de origem, os elementos no primeiro intervalo precedem os elementos do segundo intervalo de origem no intervalo de destino. Se os intervalos de origem contiverem duplicatas de um elemento, o intervalo de destino conterá o valor absoluto do número pelo qual as ocorrências desses elementos em um dos intervalos de origem excedem as ocorrências desses elementos no segundo intervalo de origem.
A complexidade do algoritmo é linear com, no máximo 2 * ((last1 - first1) + (last2 - first2)) - 1 , comparações para intervalos de fontes não vazias.
Exemplo
// alg_set_sym_diff.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser (int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
}
int main()
{
using namespace std;
vector<int> v1a, v1b, v1 ( 12 );
vector<int>::iterator Iter1a, Iter1b, Iter1, Result1;
// Constructing vectors v1a & v1b with default less-than ordering
int i;
for ( i = -1 ; i <= 4 ; i++ )
{
v1a.push_back( i );
}
int ii;
for ( ii =-3 ; ii <= 0 ; ii++ )
{
v1b.push_back( ii );
}
cout << "Original vector v1a with range sorted by the\n "
<< "binary predicate less than is v1a = ( " ;
for ( Iter1a = v1a.begin( ) ; Iter1a != v1a.end( ) ; Iter1a++ )
cout << *Iter1a << " ";
cout << ")." << endl;
cout << "Original vector v1b with range sorted by the\n "
<< "binary predicate less than is v1b = ( " ;
for ( Iter1b = v1b.begin( ) ; Iter1b != v1b.end( ) ; Iter1b++ )
cout << *Iter1b << " ";
cout << ")." << endl;
// Constructing vectors v2a & v2b with ranges sorted by greater
vector<int> v2a ( v1a ) , v2b ( v1b ) , v2 ( v1 );
vector<int>::iterator Iter2a, Iter2b, Iter2, Result2;
sort ( v2a.begin( ), v2a.end( ), greater<int>( ) );
sort ( v2b.begin( ), v2b.end( ), greater<int>( ) );
cout << "Original vector v2a with range sorted by the\n "
<< "binary predicate greater is v2a = ( " ;
for ( Iter2a = v2a.begin( ) ; Iter2a != v2a.end( ) ; Iter2a++ )
cout << *Iter2a << " ";
cout << ")." << endl;
cout << "Original vector v2b with range sorted by the\n "
<< "binary predicate greater is v2b = ( " ;
for ( Iter2b = v2b.begin( ) ; Iter2b != v2b.end( ) ; Iter2b++ )
cout << *Iter2b << " ";
cout << ")." << endl;
// Constructing vectors v3a & v3b with ranges sorted by mod_lesser
vector<int> v3a ( v1a ), v3b ( v1b ) , v3 ( v1 );
vector<int>::iterator Iter3a, Iter3b, Iter3, Result3;
sort ( v3a.begin( ), v3a.end( ), mod_lesser );
sort ( v3b.begin( ), v3b.end( ), mod_lesser );
cout << "Original vector v3a with range sorted by the\n "
<< "binary predicate mod_lesser is v3a = ( " ;
for ( Iter3a = v3a.begin( ) ; Iter3a != v3a.end( ) ; Iter3a++ )
cout << *Iter3a << " ";
cout << ")." << endl;
cout << "Original vector v3b with range sorted by the\n "
<< "binary predicate mod_lesser is v3b = ( " ;
for ( Iter3b = v3b.begin( ) ; Iter3b != v3b.end( ) ; Iter3b++ )
cout << *Iter3b << " ";
cout << ")." << endl;
// To combine into a symmetric difference in ascending
// order with the default binary predicate less<int>( )
Result1 = set_symmetric_difference ( v1a.begin( ), v1a.end( ),
v1b.begin( ), v1b.end( ), v1.begin( ) );
cout << "Set_symmetric_difference of source ranges with default order,"
<< "\n vector v1mod = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != Result1 ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// To combine into a symmetric difference in descending
// order, specify binary predicate greater<int>( )
Result2 = set_symmetric_difference ( v2a.begin( ), v2a.end( ),
v2b.begin( ), v2b.end( ),v2.begin( ), greater<int>( ) );
cout << "Set_symmetric_difference of source ranges with binary"
<< "predicate greater specified,\n vector v2mod = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != Result2 ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
// To combine into a symmetric difference applying a user
// defined binary predicate mod_lesser
Result3 = set_symmetric_difference ( v3a.begin( ), v3a.end( ),
v3b.begin( ), v3b.end( ), v3.begin( ), mod_lesser );
cout << "Set_symmetric_difference of source ranges with binary "
<< "predicate mod_lesser specified,\n vector v3mod = ( " ; ;
for ( Iter3 = v3.begin( ) ; Iter3 != Result3 ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
}
Original vector v1a with range sorted by the
binary predicate less than is v1a = ( -1 0 1 2 3 4 ).
Original vector v1b with range sorted by the
binary predicate less than is v1b = ( -3 -2 -1 0 ).
Original vector v2a with range sorted by the
binary predicate greater is v2a = ( 4 3 2 1 0 -1 ).
Original vector v2b with range sorted by the
binary predicate greater is v2b = ( 0 -1 -2 -3 ).
Original vector v3a with range sorted by the
binary predicate mod_lesser is v3a = ( 0 -1 1 2 3 4 ).
Original vector v3b with range sorted by the
binary predicate mod_lesser is v3b = ( 0 -1 -2 -3 ).
Set_symmetric_difference of source ranges with default order,
vector v1mod = ( -3 -2 1 2 3 4 ).
Set_symmetric_difference of source ranges with binarypredicate greater specified,
vector v2mod = ( 4 3 2 1 -2 -3 ).
Set_symmetric_difference of source ranges with binary predicate mod_lesser specified,
vector v3mod = ( 1 4 ).
set_union
Unifica todos os elementos que pertencem a pelo menos um dos dois intervalos de origem classificados em um único intervalo de destino classificado. Um predicado binário pode especificar o critério de ordenação.
template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result );
template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator set_union(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result,
Compare pred );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator>
ForwardIterator set_union(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator, class Compare>
ForwardIterator set_union(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador de entrada abordando a posição do primeiro elemento no primeiro de dois intervalos de origem classificados a serem unidos e classificados em um único intervalo representando a união dos dois intervalos de origem.
last1
Um iterador de entrada que aborda a posição um após o último elemento no primeiro de dois intervalos de origem classificados a serem unidos e classificados em um único intervalo que representa a união dos dois intervalos de origem.
first2
Um iterador de entrada abordando a posição do primeiro elemento no segundo de dois intervalos de origem classificados consecutivos a serem unidos e classificados em um único intervalo representando a união dos dois intervalos de origem.
last2
Um iterador de entrada abordando a posição um após o último elemento no segundo de dois intervalos de origem classificados consecutivos a serem unidos e classificados em um único intervalo representando a união dos dois intervalos de origem.
result
Um iterador de saída que aborda a posição do primeiro elemento no intervalo de destino onde os dois intervalos de origem devem ser unidos em um único intervalo classificado representando a união dos dois intervalos de origem.
pred
Objeto de função de predicado definido pelo usuário que define o sentido em que um elemento é menor que outro. O predicado binário usa dois argumentos e deve retornar true quando o primeiro elemento é menor que o segundo elemento e false caso contrário.
Valor de retorno
Um iterador de saída endereçando a posição um após o último elemento no intervalo de destino classificado representando a união dos dois intervalos de origem.
Observações
Os intervalos de origem classificados referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição deve ser alcançável a partir da primeira por incremento.
O intervalo de destino não deve sobrepor-se a nenhum dos intervalos de origem e deve ser grande o suficiente para conter o intervalo de destino.
Os intervalos de fontes ordenadas devem ser organizados como uma pré-condição para a aplicação do merge algoritmo de acordo com a mesma ordenação que deve ser usada pelo algoritmo para classificar os intervalos combinados.
A operação é estável à medida que a ordem relativa dos elementos dentro de cada intervalo é preservada no intervalo de destino. Os intervalos de origem não são modificados pelo algoritmo merge.
Os tipos de valor dos iteradores de entrada devem ser menores do que comparáveis para serem encomendados. Ou seja, dados dois elementos, você pode determinar que um é menor que o outro, ou que eles são equivalentes. (Aqui, equivalente significa que nenhum é menor que o outro.) Esta comparação resulta numa ordenação entre os elementos não equivalentes. Quando há elementos equivalentes em ambos os intervalos de origem, os elementos no primeiro intervalo precedem os elementos do segundo intervalo de origem no intervalo de destino. Se os intervalos de origem contiverem duplicatas de um elemento, o intervalo de destino conterá o número máximo desses elementos que ocorrem em ambos os intervalos de origem.
A complexidade do algoritmo é linear com, no máximo 2 * ((last1 - first1) + (last2 - first2)) - 1 , comparações.
Exemplo
// alg_set_union.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
}
int main()
{
using namespace std;
vector<int> v1a, v1b, v1 ( 12 );
vector<int>::iterator Iter1a, Iter1b, Iter1, Result1;
// Constructing vectors v1a & v1b with default less than ordering
int i;
for ( i = -1 ; i <= 3 ; i++ )
{
v1a.push_back( i );
}
int ii;
for ( ii =-3 ; ii <= 1 ; ii++ )
{
v1b.push_back( ii );
}
cout << "Original vector v1a with range sorted by the\n "
<< "binary predicate less than is v1a = ( " ;
for ( Iter1a = v1a.begin( ) ; Iter1a != v1a.end( ) ; Iter1a++ )
cout << *Iter1a << " ";
cout << ")." << endl;
cout << "Original vector v1b with range sorted by the\n "
<< "binary predicate less than is v1b = ( " ;
for ( Iter1b = v1b.begin( ) ; Iter1b != v1b.end( ) ; Iter1b++ )
cout << *Iter1b << " ";
cout << ")." << endl;
// Constructing vectors v2a & v2b with ranges sorted by greater
vector<int> v2a ( v1a ) , v2b ( v1b ) , v2 ( v1 );
vector<int>::iterator Iter2a, Iter2b, Iter2, Result2;
sort ( v2a.begin( ), v2a.end( ), greater<int>( ) );
sort ( v2b.begin( ), v2b.end( ), greater<int>( ) );
cout << "Original vector v2a with range sorted by the\n "
<< "binary predicate greater is v2a = ( " ;
for ( Iter2a = v2a.begin( ) ; Iter2a != v2a.end( ) ; Iter2a++ )
cout << *Iter2a << " ";
cout << ")." << endl;
cout << "Original vector v2b with range sorted by the\n "
<< "binary predicate greater is v2b = ( " ;
for ( Iter2b = v2b.begin( ) ; Iter2b != v2b.end( ) ; Iter2b++ )
cout << *Iter2b << " ";
cout << ")." << endl;
// Constructing vectors v3a & v3b with ranges sorted by mod_lesser
vector<int> v3a ( v1a ), v3b ( v1b ) , v3 ( v1 );
vector<int>::iterator Iter3a, Iter3b, Iter3, Result3;
sort ( v3a.begin( ), v3a.end( ), mod_lesser );
sort ( v3b.begin( ), v3b.end( ), mod_lesser );
cout << "Original vector v3a with range sorted by the\n "
<< "binary predicate mod_lesser is v3a = ( " ;
for ( Iter3a = v3a.begin( ) ; Iter3a != v3a.end( ) ; Iter3a++ )
cout << *Iter3a << " ";
cout << ")." << endl;
cout << "Original vector v3b with range sorted by the\n "
<< "binary predicate mod_lesser is v3b = ( " ;
for ( Iter3b = v3b.begin( ) ; Iter3b != v3b.end( ) ; Iter3b++ )
cout << *Iter3b << " ";
cout << ")." << endl;
// To combine into a union in ascending order with the default
// binary predicate less<int>( )
Result1 = set_union ( v1a.begin( ), v1a.end( ),
v1b.begin( ), v1b.end( ), v1.begin( ) );
cout << "Union of source ranges with default order,"
<< "\n vector v1mod = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != Result1 ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// To combine into a union in descending order, specify binary
// predicate greater<int>( )
Result2 = set_union ( v2a.begin( ), v2a.end( ),
v2b.begin( ), v2b.end( ),v2.begin( ), greater<int>( ) );
cout << "Union of source ranges with binary predicate greater "
<< "specified,\n vector v2mod = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != Result2 ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
// To combine into a union applying a user-defined
// binary predicate mod_lesser
Result3 = set_union ( v3a.begin( ), v3a.end( ),
v3b.begin( ), v3b.end( ), v3.begin( ), mod_lesser );
cout << "Union of source ranges with binary predicate "
<< "mod_lesser specified,\n vector v3mod = ( " ; ;
for ( Iter3 = v3.begin( ) ; Iter3 != Result3 ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
}
Original vector v1a with range sorted by the
binary predicate less than is v1a = ( -1 0 1 2 3 ).
Original vector v1b with range sorted by the
binary predicate less than is v1b = ( -3 -2 -1 0 1 ).
Original vector v2a with range sorted by the
binary predicate greater is v2a = ( 3 2 1 0 -1 ).
Original vector v2b with range sorted by the
binary predicate greater is v2b = ( 1 0 -1 -2 -3 ).
Original vector v3a with range sorted by the
binary predicate mod_lesser is v3a = ( 0 -1 1 2 3 ).
Original vector v3b with range sorted by the
binary predicate mod_lesser is v3b = ( 0 -1 1 -2 -3 ).
Union of source ranges with default order,
vector v1mod = ( -3 -2 -1 0 1 2 3 ).
Union of source ranges with binary predicate greater specified,
vector v2mod = ( 3 2 1 0 -1 -2 -3 ).
Union of source ranges with binary predicate mod_lesser specified,
vector v3mod = ( 0 -1 1 2 3 ).
shuffle
Embaralha (reorganiza) elementos para um determinado intervalo usando um gerador de números aleatórios.
template<class RandomAccessIterator, class UniformRandomNumberGenerator>
void shuffle(
RandomAccessIterator first,
RandomAccessIterator last,
UniformRandomNumberGenerator&& gen);
Parâmetros
first
Um iterador para o primeiro elemento do intervalo a ser embaralhado, inclusive. Deve cumprir os requisitos de RandomAccessIterator e ValueSwappable.
last
Um iterador para o último elemento do intervalo a ser embaralhado, exclusivo. Deve cumprir os requisitos de RandomAccessIterator e ValueSwappable.
gen
O gerador de números aleatórios que a shuffle() função usará para a operação. Deve cumprir os requisitos de um UniformRandomNumberGenerator.
Observações
Para obter mais informações e um exemplo de código que usa shuffle()o , consulte <random>.
sort
Organiza os elementos em um intervalo especificado em uma ordem não decrescente ou de acordo com um critério de ordenação especificado por um predicado binário.
template<class RandomAccessIterator>
void sort(
RandomAccessIterator first,
RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void sort(
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
template<class ExecutionPolicy, class RandomAccessIterator>
void sort(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last);
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
void sort(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de acesso aleatório abordando a posição do primeiro elemento no intervalo a ser classificado.
last
Um iterador de acesso aleatório abordando a posição um após o elemento final no intervalo a ser classificado.
pred
Objeto de função de predicado definido pelo usuário que define o critério de comparação a ser satisfeito por elementos sucessivos na ordenação. Este predicado binário usa dois argumentos e retorna true se os dois argumentos estiverem em ordem e false de outra forma. Esta função de comparação deve impor uma ordenação fraca estrita aos pares de elementos da sequência. Para obter mais informações, consulte Algoritmos.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
Os elementos são equivalentes, mas não necessariamente iguais, se nenhum for menor que o outro. O sort algoritmo não é estável e, portanto, não garante que a ordenação relativa de elementos equivalentes será preservada. O algoritmo stable_sort preserva essa ordem original.
A média de uma complexidade de tipo é O( N log N ), onde N = last - first.
Exemplo
// alg_sort.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether first element is greater than the second
bool UDgreater ( int elem1, int elem2 )
{
return elem1 > elem2;
}
int main()
{
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1;
int i;
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 2 * i );
}
int ii;
for ( ii = 0 ; ii <= 5 ; ii++ )
{
v1.push_back( 2 * ii + 1 );
}
cout << "Original vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
sort( v1.begin( ), v1.end( ) );
cout << "Sorted vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// To sort in descending order. specify binary predicate
sort( v1.begin( ), v1.end( ), greater<int>( ) );
cout << "Resorted (greater) vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// A user-defined (UD) binary predicate can also be used
sort( v1.begin( ), v1.end( ), UDgreater );
cout << "Resorted (UDgreater) vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
}
Original vector v1 = ( 0 2 4 6 8 10 1 3 5 7 9 11 )
Sorted vector v1 = ( 0 1 2 3 4 5 6 7 8 9 10 11 )
Resorted (greater) vector v1 = ( 11 10 9 8 7 6 5 4 3 2 1 0 )
Resorted (UDgreater) vector v1 = ( 11 10 9 8 7 6 5 4 3 2 1 0 )
sort_heap
Converte uma pilha em um intervalo classificado.
template<class RandomAccessIterator>
void sort_heap(
RandomAccessIterator first,
RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void sort_heap(
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
Parâmetros
first
Um iterador de acesso aleatório que aborda a posição do primeiro elemento no heap de destino.
last
Um iterador de acesso aleatório abordando a posição um após o elemento final no heap de destino.
pred
Objeto de função de predicado definido pelo usuário que define o sentido em que um elemento é menor que outro. Um predicado de comparação usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Observações
As pilhas têm duas propriedades:
O primeiro elemento é sempre o maior.
Os elementos podem ser adicionados ou removidos em tempo logarítmico.
Após o aplicativo se este algoritmo, o intervalo ao qual ele foi aplicado não é mais um heap.
sort_heap não é uma classificação estável porque a ordem relativa dos elementos equivalentes não é necessariamente preservada.
Os heaps são uma maneira ideal de implementar filas de prioridade e são usados na implementação da classe do adaptador priority_queuede contêiner C++ Standard Library.
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
A complexidade é, no máximo N log N, onde N = last - first.
Exemplo
// alg_sort_heap.cpp
// compile with: /EHsc
#include <algorithm>
#include <functional>
#include <iostream>
#include <ostream>
#include <string>
#include <vector>
using namespace std;
void print(const string& s, const vector<int>& v)
{
cout << s << ": ( ";
for (auto i = v.begin(); i != v.end(); ++i)
{
cout << *i << " ";
}
cout << ")" << endl;
}
int main()
{
vector<int> v;
for (int i = 1; i <= 9; ++i)
{
v.push_back(i);
}
print("Initially", v);
random_shuffle(v.begin(), v.end());
print("After random_shuffle", v);
make_heap(v.begin(), v.end());
print(" After make_heap", v);
sort_heap(v.begin(), v.end());
print(" After sort_heap", v);
random_shuffle(v.begin(), v.end());
print(" After random_shuffle", v);
make_heap(v.begin(), v.end(), greater<int>());
print("After make_heap with greater<int>", v);
sort_heap(v.begin(), v.end(), greater<int>());
print("After sort_heap with greater<int>", v);
}
Initially: ( 1 2 3 4 5 6 7 8 9 )
After random_shuffle: ( 5 4 8 9 1 6 3 2 7 )
After make_heap: ( 9 7 8 5 1 6 3 2 4 )
After sort_heap: ( 1 2 3 4 5 6 7 8 9 )
After random_shuffle: ( 1 3 6 8 9 5 4 2 7 )
After make_heap with greater<int>: ( 1 2 4 3 9 5 6 8 7 )
After sort_heap with greater<int>: ( 9 8 7 6 5 4 3 2 1 )
stable_partition
Classifica os elementos em um intervalo em dois conjuntos disjuntos, com os elementos que satisfazem um predicado unário precedendo os que não o satisfazem, preservando a ordem relativa dos elementos equivalentes.
template<class BidirectionalIterator, class UnaryPredicate>
BidirectionalIterator stable_partition(
BidirectionalIterator first,
BidirectionalIterator last,
UnaryPredicate pred );
template<class ExecutionPolicy, class BidirectionalIterator, class UnaryPredicate>
BidirectionalIterator stable_partition(
ExecutionPolicy&& exec,
BidirectionalIterator first,
BidirectionalIterator last,
UnaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador bidirecional que aborda a posição do primeiro elemento no intervalo a ser particionado.
last
Um iterador bidirecional que aborda a posição um após o elemento final no intervalo a ser particionado.
pred
Objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita se um elemento deve ser classificado. Um predicado unário pega um único argumento e retorna true se satisfeito, ou false se não estiver satisfeito.
Valor de retorno
Um iterador bidirecional que aborda a posição do primeiro elemento no intervalo para não satisfazer a condição de predicado.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
Os elementos a e b são equivalentes, mas não necessariamente iguais, se ambos pred( a, b ) forem falsos e pred( b, a ) forem falsos, onde pred é o predicado especificado pelo parâmetro. O stable_partition algoritmo é estável e garante que a ordenação relativa de elementos equivalentes será preservada. O algoritmo partition não preserva necessariamente essa ordem original.
Exemplo
// alg_stable_partition.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
bool greater5 ( int value )
{
return value > 5;
}
int main()
{
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1, Iter2, result;
int i;
for ( i = 0 ; i <= 10 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 0 ; ii <= 4 ; ii++ )
v1.push_back( 5 );
random_shuffle(v1.begin( ), v1.end( ) );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Partition the range with predicate greater10
result = stable_partition (v1.begin( ), v1.end( ), greater5 );
cout << "The partitioned set of elements in v1 is:\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "The first element in v1 to fail to satisfy the"
<< "\n predicate greater5 is: " << *result << "." << endl;
}
Vector v1 is ( 4 10 5 5 5 5 5 1 6 9 3 7 8 2 0 5 ).
The partitioned set of elements in v1 is:
( 10 6 9 7 8 4 5 5 5 5 5 1 3 2 0 5 ).
The first element in v1 to fail to satisfy the
predicate greater5 is: 4.
stable_sort
Organiza os elementos em um intervalo especificado em uma ordem não decrescente ou de acordo com um critério de ordenação especificado por um predicado binário. Preserva a ordenação relativa dos elementos equivalentes.
template<class BidirectionalIterator>
void stable_sort(
BidirectionalIterator first,
BidirectionalIterator last );
template<class BidirectionalIterator, class Compare>
void stable_sort(
BidirectionalIterator first,
BidirectionalIterator last,
Compare pred );
template<class ExecutionPolicy, class RandomAccessIterator>
void stable_sort(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last);
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
void stable_sort(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador bidirecional que aborda a posição do primeiro elemento no intervalo a ser classificado.
last
Um iterador bidirecional que aborda a posição um após o elemento final no intervalo a ser classificado.
pred
Objeto de função de predicado definido pelo usuário que define o critério de comparação a ser satisfeito por elementos sucessivos na ordenação. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Observações
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento.
Os elementos são equivalentes, mas não necessariamente iguais, se nenhum for menor que o outro. O sort algoritmo é estável e garante que a ordenação relativa de elementos equivalentes será preservada.
A complexidade do tempo de execução depende stable_sort da quantidade de memória disponível, mas o melhor caso (dada memória suficiente) é O(N log N) e o pior caso é O(N (log N)^2), onde N = last - first. Normalmente, o sort algoritmo é mais rápido do que stable_sort.
Exemplo
// alg_stable_sort.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether first element is greater than the second
bool UDgreater (int elem1, int elem2 )
{
return elem1 > elem2;
}
int main()
{
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1;
int i;
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 2 * i );
}
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( 2 * i );
}
cout << "Original vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
stable_sort(v1.begin( ), v1.end( ) );
cout << "Sorted vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// To sort in descending order, specify binary predicate
stable_sort(v1.begin( ), v1.end( ), greater<int>( ) );
cout << "Resorted (greater) vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// A user-defined (UD) binary predicate can also be used
stable_sort(v1.begin( ), v1.end( ), UDgreater );
cout << "Resorted (UDgreater) vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
}
Original vector v1 = ( 0 2 4 6 8 10 0 2 4 6 8 10 )
Sorted vector v1 = ( 0 0 2 2 4 4 6 6 8 8 10 10 )
Resorted (greater) vector v1 = ( 10 10 8 8 6 6 4 4 2 2 0 0 )
Resorted (UDgreater) vector v1 = ( 10 10 8 8 6 6 4 4 2 2 0 0 )
swap
A primeira substituição troca os valores de dois objetos. A segunda substituição troca os valores entre duas matrizes de objetos.
template<class Type>
void swap(
Type& left,
Type& right);
template<class Type, size_t N>
void swap(
Type (& left)[N],
Type (& right)[N]);
Parâmetros
left
Para a primeira substituição, o primeiro objeto a ter seu conteúdo trocado. Para a segunda substituição, a primeira matriz de objetos a ter seu conteúdo trocado.
right
Para a primeira substituição, o segundo objeto para ter seu conteúdo trocado. Para a segunda substituição, a segunda matriz de objetos para ter seu conteúdo trocado.
Observações
A primeira sobrecarga é projetada para operar em objetos individuais. A segunda sobrecarga troca o conteúdo de objetos entre duas matrizes.
Exemplo
// alg_swap.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1, Iter2, result;
for ( int i = 0 ; i <= 10 ; i++ )
{
v1.push_back( i );
}
for ( int ii = 0 ; ii <= 4 ; ii++ )
{
v2.push_back( 5 );
}
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Vector v2 is ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
swap( v1, v2 );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Vector v2 is ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
}
Vector v1 is ( 0 1 2 3 4 5 6 7 8 9 10 ).
Vector v2 is ( 5 5 5 5 5 ).
Vector v1 is ( 5 5 5 5 5 ).
Vector v2 is ( 0 1 2 3 4 5 6 7 8 9 10 ).
swap_ranges
Troca os elementos de um intervalo com os elementos de outro, intervalo de tamanho igual.
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 swap_ranges(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2 );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 swap_ranges(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador avançado apontando para a primeira posição do primeiro intervalo cujos elementos devem ser trocados.
last1
Um iterador avançado apontando para um passado a posição final do primeiro intervalo cujos elementos devem ser trocados.
first2
Um iterador avançado apontando para a primeira posição do segundo intervalo cujos elementos devem ser trocados.
Valor de retorno
Um iterador avançado apontando para um passado a posição final do segundo intervalo cujos elementos devem ser trocados.
Observações
Os intervalos referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição é alcançável a partir da primeira por incremento. A segunda gama tem de ser tão grande como a primeira.
A complexidade é linear com as últimas1 - primeiras1 trocas realizadas. Se elementos de contêineres do mesmo tipo estão sendo trocados, eles a swap função de membro desse contêiner deve ser usada, porque a função de membro normalmente tem complexidade constante.
Exemplo
// alg_swap_ranges.cpp
// compile with: /EHsc
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<int> v1;
deque<int> d1;
vector<int>::iterator v1Iter1;
deque<int>::iterator d1Iter1;
int i;
for ( i = 0 ; i <= 5 ; i++ )
{
v1.push_back( i );
}
int ii;
for ( ii =4 ; ii <= 9 ; ii++ )
{
d1.push_back( 6 );
}
cout << "Vector v1 is ( " ;
for ( v1Iter1 = v1.begin( ) ; v1Iter1 != v1.end( ) ;v1Iter1 ++ )
cout << *v1Iter1 << " ";
cout << ")." << endl;
cout << "Deque d1 is ( " ;
for ( d1Iter1 = d1.begin( ) ; d1Iter1 != d1.end( ) ;d1Iter1 ++ )
cout << *d1Iter1 << " ";
cout << ")." << endl;
swap_ranges ( v1.begin( ), v1.end( ), d1.begin( ) );
cout << "After the swap_range, vector v1 is ( " ;
for ( v1Iter1 = v1.begin( ) ; v1Iter1 != v1.end( ) ;v1Iter1 ++ )
cout << *v1Iter1 << " ";
cout << ")." << endl;
cout << "After the swap_range deque d1 is ( " ;
for ( d1Iter1 = d1.begin( ) ; d1Iter1 != d1.end( ) ;d1Iter1 ++ )
cout << *d1Iter1 << " ";
cout << ")." << endl;
}
Vector v1 is ( 0 1 2 3 4 5 ).
Deque d1 is ( 6 6 6 6 6 6 ).
After the swap_range, vector v1 is ( 6 6 6 6 6 6 ).
After the swap_range deque d1 is ( 0 1 2 3 4 5 ).
transform
Aplica um objeto de função especificado a cada elemento em um intervalo de origem ou a um par de elementos de dois intervalos de origem. Em seguida, ele copia os valores de retorno do objeto de função em um intervalo de destino.
template<class InputIterator, class OutputIterator, class UnaryFunction>
OutputIterator transform(
InputIterator first1,
InputIterator last1,
OutputIterator result,
UnaryFunction func );
template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction>
OutputIterator transform(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
OutputIterator result,
BinaryFunction func );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class UnaryOperation>
ForwardIterator2 transform(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result,
UnaryOperation op);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator, class BinaryOperation>
ForwardIterator transform(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator result,
BinaryOperation binary_op);
Parâmetros
exec
A política de execução a ser usada.
first1
Um iterador de entrada que aborda a posição do primeiro elemento no primeiro intervalo de origem para operar.
last1
Um iterador de entrada que aborda a posição um após o elemento final no primeiro intervalo de origem para operar.
first2
Um iterador de entrada abordando a posição do primeiro elemento no segundo intervalo de origem para operar.
result
Um iterador de saída que aborda a posição do primeiro elemento no intervalo de destino.
func
Objeto de função unária definido pelo usuário usado na primeira versão do algoritmo para aplicar a cada elemento no primeiro intervalo de origem ou um objeto de função binária definido pelo usuário (UD) usado na segunda versão do algoritmo que é aplicado em pares, em uma ordem de encaminhamento, aos dois intervalos de origem.
Valor de retorno
Um iterador de saída que aborda a posição um após o elemento final no intervalo de destino que está recebendo os elementos de saída transformados pelo objeto de função.
Observações
Os intervalos referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de cada sequência, a última posição deve ser alcançável a partir da primeira por incremento. O intervalo de destino deve ser grande o suficiente para conter o intervalo de origem transformado.
Se o resultado for definido igual ao first1 da primeira versão do algoritmo, os intervalos de origem e destino serão os mesmos e a sequência será modificada no local. Mas o result pode não abordar uma posição dentro do intervalo [first1 + 1, last1).
A complexidade é linear. Faz no máximo (last1 - first1) comparações.
Exemplo
// alg_transform.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
// The function object multiplies an element by a Factor
template <class Type>
class MultValue
{
private:
Type Factor; // The value to multiply by
public:
// Constructor initializes the value to multiply by
MultValue ( const Type& value ) : Factor ( value ) { }
// The function call for the element to be multiplied
Type operator( ) ( Type& elem ) const
{
return elem * Factor;
}
};
int main()
{
using namespace std;
vector<int> v1, v2 ( 7 ), v3 ( 7 );
vector<int>::iterator Iter1, Iter2 , Iter3;
// Constructing vector v1
int i;
for ( i = -4 ; i <= 2 ; i++ )
{
v1.push_back( i );
}
cout << "Original vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Modifying the vector v1 in place
transform (v1.begin( ), v1.end( ), v1.begin( ), MultValue<int> ( 2 ) );
cout << "The elements of the vector v1 multiplied by 2 in place gives:"
<< "\n v1mod = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Using transform to multiply each element by a factor of 5
transform ( v1.begin( ), v1.end( ), v2.begin( ), MultValue<int> ( 5 ) );
cout << "Multiplying the elements of the vector v1mod\n "
<< "by the factor 5 & copying to v2 gives:\n v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
// The second version of transform used to multiply the
// elements of the vectors v1mod & v2 pairwise
transform ( v1.begin( ), v1.end( ), v2.begin( ), v3.begin( ),
multiplies<int>( ) );
cout << "Multiplying elements of the vectors v1mod and v2 pairwise "
<< "gives:\n v3 = ( " ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
}
Original vector v1 = ( -4 -3 -2 -1 0 1 2 ).
The elements of the vector v1 multiplied by 2 in place gives:
v1mod = ( -8 -6 -4 -2 0 2 4 ).
Multiplying the elements of the vector v1mod
by the factor 5 & copying to v2 gives:
v2 = ( -40 -30 -20 -10 0 10 20 ).
Multiplying elements of the vectors v1mod and v2 pairwise gives:
v3 = ( 320 180 80 20 0 20 80 ).
unique
Remove elementos duplicados que estão próximos uns dos outros em um intervalo especificado.
template<class ForwardIterator>
ForwardIterator unique(
ForwardIterator first,
ForwardIterator last);
template<class ForwardIterator, class BinaryPredicate>
ForwardIterator unique(
ForwardIterator first,
ForwardIterator last,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator>
ForwardIterator unique(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class BinaryPredicate>
ForwardIterator unique(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
BinaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de encaminhamento abordando a posição do primeiro elemento no intervalo a ser verificado para remoção de duplicados.
last
Um iterador de encaminhamento abordando a posição um após o elemento final no intervalo a ser verificado para remoção de duplicados.
pred
Objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita se dois elementos devem ser tomados como equivalentes. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
Um iterador de encaminhamento para a nova extremidade da sequência modificada que não contém duplicatas consecutivas, endereçando a posição um após o último elemento não removido.
Observações
Ambas as formas do algoritmo removem a segunda duplicata de um par consecutivo de elementos iguais.
A operação do algoritmo é estável para que a ordem relativa dos elementos não excluídos não seja alterada.
O intervalo referenciado deve ser válido; Todos os ponteiros devem ser desreferenciados e, dentro da sequência, a última posição é alcançável a partir da primeira por incremento. O número de elementos na sequência não é alterado pelo algoritmo unique e os elementos além do final da sequência modificada são desreferenciados, mas não especificados.
A complexidade é linear, exigindo (last - first) - 1 comparações.
Lista fornece uma função de membro mais eficiente "único", que pode ter um melhor desempenho.
Esses algoritmos não podem ser usados em um contêiner associativo.
Exemplo
// alg_unique.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
#include <ostream>
using namespace std;
// Return whether modulus of elem1 is equal to modulus of elem2
bool mod_equal ( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 == elem2;
};
int main()
{
vector<int> v1;
vector<int>::iterator v1_Iter1, v1_Iter2, v1_Iter3,
v1_NewEnd1, v1_NewEnd2, v1_NewEnd3;
int i;
for ( i = 0 ; i <= 3 ; i++ )
{
v1.push_back( 5 );
v1.push_back( -5 );
}
int ii;
for ( ii = 0 ; ii <= 3 ; ii++ )
{
v1.push_back( 4 );
}
v1.push_back( 7 );
cout << "Vector v1 is ( " ;
for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1.end( ) ; v1_Iter1++ )
cout << *v1_Iter1 << " ";
cout << ")." << endl;
// Remove consecutive duplicates
v1_NewEnd1 = unique ( v1.begin( ), v1.end( ) );
cout << "Removing adjacent duplicates from vector v1 gives\n ( " ;
for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1_NewEnd1 ; v1_Iter1++ )
cout << *v1_Iter1 << " ";
cout << ")." << endl;
// Remove consecutive duplicates under the binary prediate mod_equals
v1_NewEnd2 = unique ( v1.begin( ), v1_NewEnd1 , mod_equal );
cout << "Removing adjacent duplicates from vector v1 under the\n "
<< " binary predicate mod_equal gives\n ( " ;
for ( v1_Iter2 = v1.begin( ) ; v1_Iter2 != v1_NewEnd2 ; v1_Iter2++ )
cout << *v1_Iter2 << " ";
cout << ")." << endl;
// Remove elements if preceded by an element that was greater
v1_NewEnd3 = unique ( v1.begin( ), v1_NewEnd2, greater<int>( ) );
cout << "Removing adjacent elements satisfying the binary\n "
<< " predicate greater<int> from vector v1 gives ( " ;
for ( v1_Iter3 = v1.begin( ) ; v1_Iter3 != v1_NewEnd3 ; v1_Iter3++ )
cout << *v1_Iter3 << " ";
cout << ")." << endl;
}
Vector v1 is ( 5 -5 5 -5 5 -5 5 -5 4 4 4 4 7 ).
Removing adjacent duplicates from vector v1 gives
( 5 -5 5 -5 5 -5 5 -5 4 7 ).
Removing adjacent duplicates from vector v1 under the
binary predicate mod_equal gives
( 5 4 7 ).
Removing adjacent elements satisfying the binary
predicate greater<int> from vector v1 gives ( 5 7 ).
unique_copy
Copia elementos de um intervalo de origem para um intervalo de destino, exceto para os elementos duplicados que estão próximos uns dos outros.
template<class InputIterator, class OutputIterator>
OutputIterator unique_copy(
InputIterator first,
InputIterator last,
OutputIterator result );
template<class InputIterator, class OutputIterator, class BinaryPredicate>
OutputIterator unique_copy(
InputIterator first,
InputIterator last,
OutputIterator result,
BinaryPredicate pred );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 unique_copy(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
class BinaryPredicate>
ForwardIterator2 unique_copy(ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result,
BinaryPredicate pred);
Parâmetros
exec
A política de execução a ser usada.
first
Um iterador de encaminhamento abordando a posição do primeiro elemento no intervalo de origem a ser copiado.
last
Um iterador de encaminhamento abordando a posição um após o elemento final no intervalo de origem a ser copiado.
result
Um iterador de saída que aborda a posição do primeiro elemento no intervalo de destino que está recebendo a cópia com duplicatas consecutivas removidas.
pred
Objeto de função de predicado definido pelo usuário que define a condição a ser satisfeita se dois elementos devem ser tomados como equivalentes. Um predicado binário usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
Um iterador de saída endereçando a posição um após o elemento final no intervalo de destino que está recebendo a cópia com duplicatas consecutivas removidas.
Observações
Ambas as formas do algoritmo removem a segunda duplicata de um par consecutivo de elementos iguais.
A operação do algoritmo é estável para que a ordem relativa dos elementos não excluídos não seja alterada.
Os intervalos referenciados devem ser válidos; Todos os ponteiros devem ser desreferenciados e, dentro de uma sequência, a última posição é alcançável a partir da primeira por incremento.
A complexidade é linear, exigindo (last - first) comparações.
Exemplo
// alg_unique_copy.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
#include <ostream>
using namespace std;
// Return whether modulus of elem1 is equal to modulus of elem2
bool mod_equal ( int elem1, int elem2 ) {
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 == elem2;
};
int main() {
vector<int> v1;
vector<int>::iterator v1_Iter1, v1_Iter2,
v1_NewEnd1, v1_NewEnd2;
int i;
for ( i = 0 ; i <= 1 ; i++ ) {
v1.push_back( 5 );
v1.push_back( -5 );
}
int ii;
for ( ii = 0 ; ii <= 2 ; ii++ )
v1.push_back( 4 );
v1.push_back( 7 );
int iii;
for ( iii = 0 ; iii <= 5 ; iii++ )
v1.push_back( 10 );
cout << "Vector v1 is\n ( " ;
for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1.end( ) ; v1_Iter1++ )
cout << *v1_Iter1 << " ";
cout << ")." << endl;
// Copy first half to second, removing consecutive duplicates
v1_NewEnd1 = unique_copy ( v1.begin( ), v1.begin( ) + 8, v1.begin( ) + 8 );
cout << "Copying the first half of the vector to the second half\n "
<< "while removing adjacent duplicates gives\n ( " ;
for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1_NewEnd1 ; v1_Iter1++ )
cout << *v1_Iter1 << " ";
cout << ")." << endl;
int iv;
for ( iv = 0 ; iv <= 7 ; iv++ )
v1.push_back( 10 );
// Remove consecutive duplicates under the binary prediate mod_equals
v1_NewEnd2 = unique_copy ( v1.begin( ), v1.begin( ) + 14,
v1.begin( ) + 14 , mod_equal );
cout << "Copying the first half of the vector to the second half\n "
<< " removing adjacent duplicates under mod_equals gives\n ( " ;
for ( v1_Iter2 = v1.begin( ) ; v1_Iter2 != v1_NewEnd2 ; v1_Iter2++ )
cout << *v1_Iter2 << " ";
cout << ")." << endl;
}
Vector v1 is
( 5 -5 5 -5 4 4 4 7 10 10 10 10 10 10 ).
Copying the first half of the vector to the second half
while removing adjacent duplicates gives
( 5 -5 5 -5 4 4 4 7 5 -5 5 -5 4 7 ).
Copying the first half of the vector to the second half
removing adjacent duplicates under mod_equals gives
( 5 -5 5 -5 4 4 4 7 5 -5 5 -5 4 7 5 4 7 5 4 7 ).
upper_bound
Localiza a posição do primeiro elemento em um intervalo ordenado que tem um valor maior do que um valor especificado. Um predicado binário especifica o critério de ordenação.
template<class ForwardIterator, class Type>
ForwardIterator upper_bound(
ForwardIterator first,
ForwardIterator last,
const Type& value);
template<class ForwardIterator, class Type, class Compare>
ForwardIterator upper_bound(
ForwardIterator first,
ForwardIterator last,
const Type& value,
Compare pred);
Parâmetros
first
A posição do primeiro elemento no intervalo a ser pesquisado.
last
A posição um passado o elemento final no intervalo a ser pesquisado.
value
O valor no intervalo ordenado que precisa ser excedido pelo valor do elemento endereçado pelo iterador retornado.
pred
Objeto de função de predicado de comparação definido pelo usuário que define o sentido em que um elemento é menor que outro. Um predicado de comparação usa dois argumentos e retorna true quando satisfeito e false quando não satisfeito.
Valor de retorno
Um iterador de encaminhamento para a posição do primeiro elemento que tem um valor maior do que um valor especificado.
Observações
O intervalo de origem classificado referenciado deve ser válido; Todos os iteradores devem ser desreferenciados e, dentro da sequência, a última posição deve ser alcançável a partir da primeira por incremento.
Um intervalo ordenado é uma pré-condição da utilização de e onde o critério de ordenação é o mesmo especificado pelo predicado de upper_bound comparação.
O intervalo não é modificado pelo upper_bound.
Os tipos de valor dos iteradores de encaminhamento devem ser menores do que comparáveis para serem encomendados. Ou seja, dados dois elementos, você pode determinar que um é menor que o outro, ou que eles são equivalentes. (Aqui, equivalente significa que nenhum é menor que o outro.) Esta comparação resulta numa ordenação entre os elementos não equivalentes.
A complexidade do algoritmo é logarítmica para iteradores de acesso aleatório e linear de outra forma, com o número de passos proporcional a (last - first).
Exemplo
// alg_upper_bound.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser( int elem1, int elem2 )
{
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
}
int main()
{
using namespace std;
vector<int> v1;
// Constructing vector v1 with default less-than ordering
for ( auto i = -1 ; i <= 4 ; ++i )
{
v1.push_back( i );
}
for ( auto ii =-3 ; ii <= 0 ; ++ii )
{
v1.push_back( ii );
}
cout << "Starting vector v1 = ( " ;
for (const auto &Iter : v1)
cout << Iter << " ";
cout << ")." << endl;
sort(v1.begin(), v1.end());
cout << "Original vector v1 with range sorted by the\n "
<< "binary predicate less than is v1 = ( " ;
for (const auto &Iter : v1)
cout << Iter << " ";
cout << ")." << endl;
// Constructing vector v2 with range sorted by greater
vector<int> v2(v1);
sort(v2.begin(), v2.end(), greater<int>());
cout << "Original vector v2 with range sorted by the\n "
<< "binary predicate greater is v2 = ( " ;
for (const auto &Iter : v2)
cout << Iter << " ";
cout << ")." << endl;
// Constructing vectors v3 with range sorted by mod_lesser
vector<int> v3(v1);
sort(v3.begin(), v3.end(), mod_lesser);
cout << "Original vector v3 with range sorted by the\n "
<< "binary predicate mod_lesser is v3 = ( " ;
for (const auto &Iter : v3)
cout << Iter << " ";
cout << ")." << endl;
// Demonstrate upper_bound
vector<int>::iterator Result;
// upper_bound of 3 in v1 with default binary predicate less<int>()
Result = upper_bound(v1.begin(), v1.end(), 3);
cout << "The upper_bound in v1 for the element with a value of 3 is: "
<< *Result << "." << endl;
// upper_bound of 3 in v2 with the binary predicate greater<int>( )
Result = upper_bound(v2.begin(), v2.end(), 3, greater<int>());
cout << "The upper_bound in v2 for the element with a value of 3 is: "
<< *Result << "." << endl;
// upper_bound of 3 in v3 with the binary predicate mod_lesser
Result = upper_bound(v3.begin(), v3.end(), 3, mod_lesser);
cout << "The upper_bound in v3 for the element with a value of 3 is: "
<< *Result << "." << endl;
}
Starting vector v1 = ( -1 0 1 2 3 4 -3 -2 -1 0 ).
Original vector v1 with range sorted by the
binary predicate less than is v1 = ( -3 -2 -1 -1 0 0 1 2 3 4 ).
Original vector v2 with range sorted by the
binary predicate greater is v2 = ( 4 3 2 1 0 0 -1 -1 -2 -3 ).
Original vector v3 with range sorted by the
binary predicate mod_lesser is v3 = ( 0 0 -1 -1 1 -2 2 -3 3 4 ).
The upper_bound in v1 for the element with a value of 3 is: 4.
The upper_bound in v2 for the element with a value of 3 is: 2.
The upper_bound in v3 for the element with a value of 3 is: 4.