使用迭代器的自定义比较器功能

时间:2018-09-16 20:56:07

标签: c++ sorting iterator comparator

我有一个2D锯齿向量(每行的大小可能不同)和一个代表2D锯齿向量的特定行中路径成本的向量。

让我们将2D锯齿状向量称为allpaths,将代价向量称为cost。如上所述,cost [i]是allpaths [i]给出的路径成本。 allpaths[i]表示路径中顶点的向量。

我想根据其费用对allpaths进行排序。如果成本相等,我想根据顶点数(向量的大小)对它进行排序。

为此,我首先制作了一个成对的向量,然后对其进行了排序。 为了节省内存,该对的第二个参数是迭代器,而不是整个向量

vector <pair<int, vector<string>::iterator>> V;
for(int i=0; i <allpaths.size(); i++)
    V.push_back(make_pair(cost[i], allpaths[i].begin()));
sort(V.begin(), V.end(), cmp);

自定义比较器功能如下:

bool cmp(const pair<int, vector<string>::iterator> A, const pair<int, vector<string>::iterator> B)
{
    if(A.first == B.first)
        return *(A.second).size() < *(B.second).size();
    return A.first < B.first;
}

这将返回大量的编译器错误。正确的方法是什么? 我认为错误在这里:*(A.second).size() < *(B.second).size()

如何将迭代器解引用到一维向量?

代码段为here

2 个答案:

答案 0 :(得分:1)

您没有提供完整的代码,所以我无法解决您的所有问题。但是,我看到了一些问题,如下所示:

  • 如果您有一个std::vector<T>的{​​{1}},那么您的比较器应该使用T = std::pair<int, std::vector<int>::iterator>的两个元素。相反,您将整个const T&。那是行不通的。

  • std::vector<T>没有成员函数std::vector<int>::iterator。结果,您将无法拥有size()A.second->size()。这里确实需要一个B.second->size(),而不仅仅是一个迭代器。迭代器只知道它指向的元素,而不知道整个向量。

但是,正如我在评论中解释的那样,std::vector具有专门的std::vector,它将在恒定时间内工作。排序算法将在内部使用swap。因此,您实际上不需要用迭代器(或指向向量的指针)替换swap

通常情况下,std::vector对象本身只是指向一些动态分配的数组的指针(以及有关其大小的信息)。 std::vector只会交换指针值(和大小信息),而不会复制数组的实际内容。

答案 1 :(得分:0)

您的cmp函数应该接受作为向量成员的参数,而不是向量本身的类型。即:pair<int, vector<int>::iterator>