Ale*_*ros 2 c++ vector map binary-search jquery-ui-sortable
我有以下课程:
struct EdgeExtended {
int neighborNodeId;
int weight;
int arrayPointer;
bool isCrossEdge;
};
Run Code Online (Sandbox Code Playgroud)
我想要一个这样的对象的向量,通过neighborNodeId对它进行排序.然后我想搜索特定的neighborNodeId并通过二进制搜索返回对向量中找到的对象的引用.以前我用过地图,所以就是这样的:
map<int, EdgeExtended> neighbours;
.....
auto it = neighbours.find(dnodeId);
if (it != neighbours.end()) {
edgeMap = it->second;
}
Run Code Online (Sandbox Code Playgroud)
代替
map<int, EdgeExtended> neighbours;
Run Code Online (Sandbox Code Playgroud)
我希望有
vector<EdgeExtended> neighbours;
Run Code Online (Sandbox Code Playgroud)
并保留尽可能多的旧代码.
我想测量矢量是否比地图快,因为我正在构建数千个矢量(或地图),每个矢量(地图)相对较小(~10个项目).我不知道如何a)通过neighborNodeId对对象进行排序,以及b)如何使用二进制搜索来搜索类的特定成员(neighborNodeId).抱歉,这个菜鸟问题.我指望你的帮助.
您需要一个自定义比较器函数,它接受两个EdgeExtended
对象并比较您感兴趣的字段,并且可以分别传递给它们sort
和binary_search
第三个或第四个参数.
它可以通过lambda函数方便地完成:
auto Comp = [](const EdgeExtended& e1, const EdgeExtended& e2)
{
return e1.neighborNodeId < e2.neighborNodeId;
};
Run Code Online (Sandbox Code Playgroud)
如果您坚持使用C++ 11之前的版本,请编写一个带重载的类operator()
:
struct Comp {
bool operator()(const EdgeExtended& e1, const EdgeExtended& e2) const
{
return e1.neighborNodeId < e2.neighborNodeId;
}
};
Run Code Online (Sandbox Code Playgroud)