vectores una programacion matriz llenar libreria ingresar imprimir funciones ejemplos datos con como c++ vector std

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();



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; }