#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>
struct node
{
int data;
};
bool operator ==(node const& l, node const& r)
{
return l.data == r.data;
}
bool operator <(node const& l, node const& r)
{
return l.data < r.data;
}
int main()
{
std::vector<node> v;
std::srand(std::time(0));
for (int i = 0; i < 10000; ++i)
{
v.push_back({std::rand() % 1000});
}
node required {444};
// Linear search, requires equality operator...
auto i = std::find(v.begin(), v.end(), required);
if (i != v.end())
{
std::cout << i->data << " found at index " << i - v.begin() << std::endl;
}
else
{
std::cout << "Item not found" << std::endl;
}
// Alternative linear search using a predicate:
i = std::find_if(v.begin(), v.end(), [](node const& n) { return n.data == 444; } );
if (i != v.end())
{
std::cout << i->data << " found at index " << i - v.begin() << std::endl;
}
else
{
std::cout << "Item not found" << std::endl;
}
// Binary search, requires a less-than operator
// and the container to be sorted...
std::sort(v.begin(), v.end()); // This is likely to change the index!
i = std::lower_bound(v.begin(), v.end(), required);
if (i != v.end() && i->data == required.data)
{
std::cout << i->data << " found at index " << i - v.begin() << std::endl;
}
else
{
std::cout << "Item not found" << std::endl;
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjdGltZT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IG5vZGUKewogICAgaW50IGRhdGE7Cn07Cgpib29sIG9wZXJhdG9yID09KG5vZGUgY29uc3QmIGwsIG5vZGUgY29uc3QmIHIpCnsKICAgIHJldHVybiBsLmRhdGEgPT0gci5kYXRhOwp9Cgpib29sIG9wZXJhdG9yIDwobm9kZSBjb25zdCYgbCwgbm9kZSBjb25zdCYgcikKewogICAgcmV0dXJuIGwuZGF0YSA8IHIuZGF0YTsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3Rvcjxub2RlPiB2OwogICAgc3RkOjpzcmFuZChzdGQ6OnRpbWUoMCkpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgKytpKQogICAgewogICAgICAgIHYucHVzaF9iYWNrKHtzdGQ6OnJhbmQoKSAlIDEwMDB9KTsKICAgIH0KCiAgICBub2RlIHJlcXVpcmVkIHs0NDR9OwoKICAgIC8vIExpbmVhciBzZWFyY2gsIHJlcXVpcmVzIGVxdWFsaXR5IG9wZXJhdG9yLi4uCiAgICBhdXRvIGkgPSBzdGQ6OmZpbmQodi5iZWdpbigpLCB2LmVuZCgpLCByZXF1aXJlZCk7CiAgICBpZiAoaSAhPSB2LmVuZCgpKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCBpLT5kYXRhIDw8ICIgZm91bmQgYXQgaW5kZXggIiA8PCBpIC0gdi5iZWdpbigpIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkl0ZW0gbm90IGZvdW5kIiA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICAKICAgIC8vIEFsdGVybmF0aXZlIGxpbmVhciBzZWFyY2ggdXNpbmcgYSBwcmVkaWNhdGU6CiAgICBpID0gc3RkOjpmaW5kX2lmKHYuYmVnaW4oKSwgdi5lbmQoKSwgW10obm9kZSBjb25zdCYgbikgeyByZXR1cm4gbi5kYXRhID09IDQ0NDsgfSApOwogICAgaWYgKGkgIT0gdi5lbmQoKSkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgaS0+ZGF0YSA8PCAiIGZvdW5kIGF0IGluZGV4ICIgPDwgaSAtIHYuYmVnaW4oKSA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJJdGVtIG5vdCBmb3VuZCIgPDwgc3RkOjplbmRsOwogICAgfQoKICAgIC8vIEJpbmFyeSBzZWFyY2gsIHJlcXVpcmVzIGEgbGVzcy10aGFuIG9wZXJhdG9yCiAgICAvLyBhbmQgdGhlIGNvbnRhaW5lciB0byBiZSBzb3J0ZWQuLi4KICAgIHN0ZDo6c29ydCh2LmJlZ2luKCksIHYuZW5kKCkpOyAvLyBUaGlzIGlzIGxpa2VseSB0byBjaGFuZ2UgdGhlIGluZGV4IQogICAgaSA9IHN0ZDo6bG93ZXJfYm91bmQodi5iZWdpbigpLCB2LmVuZCgpLCByZXF1aXJlZCk7CiAgICBpZiAoaSAhPSB2LmVuZCgpICYmIGktPmRhdGEgPT0gcmVxdWlyZWQuZGF0YSkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgaS0+ZGF0YSA8PCAiIGZvdW5kIGF0IGluZGV4ICIgPDwgaSAtIHYuYmVnaW4oKSA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJJdGVtIG5vdCBmb3VuZCIgPDwgc3RkOjplbmRsOwogICAgfQp9Cg==