Usa std::equal_range
para encontrar una gama de elementos en un vector ordenado. std::equal_range
devuelve std::pair
de iteradores, lo que le proporciona un rango en el vector de elementos igual al argumento que proporciona. Si el rango está vacío, entonces tu artículo no está en el vector, y la longitud del rango te dice cuántas veces aparece tu elemento en el vector.
Aquí hay un ejemplo usando enteros en lugar de struct Node
:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
int main(int argc, const char * argv[])
{
std::vector<int> sorted = { 1, 2, 2, 5, 10 };
auto range = std::equal_range(sorted.begin(), sorted.end(), 20);
// Outputs "5 5"
std::cout << std::distance(sorted.begin(), range.first) << ' '
<< std::distance(sorted.begin(), range.second) << '\n';
range = std::equal_range(sorted.begin(), sorted.end(), 5);
// Outputs "3 4"
std::cout << std::distance(sorted.begin(), range.first) << ' '
<< std::distance(sorted.begin(), range.second) << '\n';
range = std::equal_range(sorted.begin(), sorted.end(), -1);
// Outputs "0 0"
std::cout << std::distance(sorted.begin(), range.first) << ' '
<< std::distance(sorted.begin(), range.second) << '\n';
return 0;
}
Para hacer este trabajo con struct Node
ya sea que usted tiene que proporcionar una operator <
para struct Node
o pasar en un comparador de std::equal_range
. Puede hacerlo proporcionando un lambda como argumento al std::equal_range
para comparar sus estructuras.
std::vector<Node> nodes = { Node{"hello", 5}, Node{"goodbye", 6} };
Node searchForMe { "goodbye", 6 };
auto range = std::equal_range(nodes.begin(), nodes.end(), searchForMe,
[](Node lhs, Node rhs) { return lhs.id < rhs.id; });
¿Estás seguro de la coma entre CString? ¿No debería ser eso un punto y coma? – razeh