una - vectores c++ ejemplos
¿Cómo saber si un elemento está presente en un std:: vector? (17)
Aquí hay una función que funcionará para cualquier contenedor:
template <class Container>
const bool contains(const Container& container, const typename Container::value_type& element)
{
return std::find(container.begin(), container.end(), element) != container.end();
}
Tenga en cuenta que puede obtener 1 parámetro de plantilla porque puede extraer el value_type
del Container. Necesita el typename
porque Container::value_type
es un nombre dependiente .
Todo lo que quiero hacer es verificar si un elemento existe en el vector o no, para poder tratar cada caso.
if ( item_present )
do_this();
else
do_that();
Como han dicho otros, use las funciones STL std::find o std::find . Pero si está buscando en vectores muy grandes y esto afecta el rendimiento, puede ordenar su vector y luego usar los binary_search
, lower_bound
o upper_bound
.
Con boost puedes usar any_of_equal
:
#include <boost/algorithm/cxx11/any_of.hpp>
bool item_present = boost::algorithm::any_of_equal(vector, element);
En C ++ 11 puedes usar any_of
. Por ejemplo, si es un vector<string> v;
entonces:
if (any_of(v.begin(), v.end(), bind2nd(equal_to<string>(), item)))
do_this();
else
do_that();
Otra muestra utilizando operadores de C ++.
#include <vector>
#include <algorithm>
#include <stdexcept>
template<typename T>
inline static bool operator ==(const std::vector<T>& v, const T& elem)
{
return (std::find(v.begin(), v.end(), elem) != v.end());
}
template<typename T>
inline static bool operator !=(const std::vector<T>& v, const T& elem)
{
return (std::find(v.begin(), v.end(), elem) == v.end());
}
enum CODEC_ID {
CODEC_ID_AAC,
CODEC_ID_AC3,
CODEC_ID_H262,
CODEC_ID_H263,
CODEC_ID_H264,
CODEC_ID_H265,
CODEC_ID_MAX
};
void main()
{
CODEC_ID codec = CODEC_ID_H264;
std::vector<CODEC_ID> codec_list;
codec_list.reserve(CODEC_ID_MAX);
codec_list.push_back(CODEC_ID_AAC);
codec_list.push_back(CODEC_ID_AC3);
codec_list.push_back(CODEC_ID_H262);
codec_list.push_back(CODEC_ID_H263);
codec_list.push_back(CODEC_ID_H264);
codec_list.push_back(CODEC_ID_H265);
if (codec_list != codec)
{
throw std::runtime_error("codec not found!");
}
if (codec_list == codec)
{
throw std::logic_error("codec has been found!");
}
}
Puede usar la función de find
, que se encuentra en el std
nombres std
, es decir, std::find
. std::find
función std::find
el iterador de begin
y end
del vector que desea buscar, junto con el elemento que está buscando y compare el iterador resultante con el final del vector para ver si coinciden o no.
std::find(vector.begin(), vector.end(), item) != vector.end()
También puede desreferenciar ese iterador y usarlo de manera normal, como cualquier otro iterador.
Puedes probar este código:
#include <algorithm>
#include <vector>
// You can use class, struct or primitive data type for Item
struct Item {
//Some fields
};
typedef std::vector<Item> ItemVector;
typedef ItemVector::iterator ItemIterator;
//...
ItemVector vtItem;
//... (init data for vtItem)
Item itemToFind;
//...
ItemIterator itemItr;
itemItr = std::find(vtItem.begin(), vtItem.end(), itemToFind);
if (itemItr != vtItem.end()) {
// Item found
// doThis()
}
else {
// Item not found
// doThat()
}
Puedes usar std::find
desde <algorithm>
:
std::find(vector.begin(), vector.end(), item) != vector.end()
Esto devuelve un bool ( true
si está presente, false
contrario). Con tu ejemplo:
#include <algorithm>
if ( std::find(vector.begin(), vector.end(), item) != vector.end() )
do_this();
else
do_that();
Puedes usar contar también. Devolverá el número de elementos presentes en un vector.
int t=count(vec.begin(),vec.end(),item);
Si quieres encontrar una cadena en un vector:
struct isEqual
{
isEqual(const std::string& s): m_s(s)
{}
bool operator()(OIDV* l)
{
return l->oid == m_s;
}
std::string m_s;
};
struct OIDV
{
string oid;
//else
};
VecOidv::iterator itFind=find_if(vecOidv.begin(),vecOidv.end(),isEqual(szTmp));
Si su vector no está ordenado, utilice el método sugerido por MSN:
if(std::find(vector.begin(), vector.end(), item)!=vector.end()){
// Found the item
}
Si su vector está ordenado, use el método binary_search que sugirió Brian Neal:
if(binary_search(vector.begin(), vector.end(), item)){
// Found the item
}
la búsqueda binaria produce O (log n) el peor desempeño, que es mucho más eficiente que el primer enfoque. Para usar la búsqueda binaria, puede usar qsort para ordenar el vector primero para garantizar que se ordene.
Tenga en cuenta que, si va a hacer muchas búsquedas, hay contenedores STL que son mejores para eso. No sé cuál es su aplicación, pero vale la pena considerar los contenedores asociativos como std :: map.
std :: vector es el contenedor de elección a menos que tenga un motivo para otro, y las búsquedas por valor pueden serlo.
Usar Newton C ++ es más fácil, auto documentado y más rápido que con std :: find porque devuelve un bool directamente.
bool exists_linear( INPUT_ITERATOR first, INPUT_ITERATOR last, const T& value )
bool exists_binary( INPUT_ITERATOR first, INPUT_ITERATOR last, const T& value )
Creo que es obvio lo que hacen las funciones.
include <newton/algorithm/algorithm.hpp>
if ( newton::exists_linear(first, last, value) )
do_this();
else
do_that();
Use find desde el encabezado del algoritmo de stl. He ilustrado su uso con int type. Puede usar cualquier tipo que desee siempre y cuando pueda comparar la igualdad (sobrecarga == si es necesario para su clase personalizada).
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
typedef vector<int> IntContainer;
typedef IntContainer::iterator IntIterator;
IntContainer vw;
//...
// find 5
IntIterator i = find(vw.begin(), vw.end(), 5);
if (i != vw.end()) {
// found it
} else {
// doesn''t exist
}
return 0;
}
Utilice la función de find STL.
Tenga en cuenta que también hay una función find_if , que puede usar si su búsqueda es más compleja, es decir, si no solo está buscando un elemento, sino que, por ejemplo, desea ver si hay un elemento que cumpla con ciertos requisitos. condición, por ejemplo, una cadena que comienza con "abc". ( find_if
le daría un iterador que apunta al primer elemento).
Yo uso algo como esto ...
#include <algorithm>
template <typename T>
const bool Contains( std::vector<T>& Vec, const T& Element )
{
if (std::find(Vec.begin(), Vec.end(), Element) != Vec.end())
return true;
return false;
}
if (Contains(vector,item))
blah
else
blah
... así de hecho es claro y legible. (Obviamente puedes reutilizar la plantilla en varios lugares).
template <typename T> bool IsInVector(T what, std::vector<T> * vec)
{
if(std::find(vec->begin(),vec->end(),what)!=vec->end())
return true;
return false;
}