使用std :: sort对迭代器进行排序

时间:2016-12-31 20:39:29

标签: c++ sorting

我想对包含指向另一个向量int_vec中的元素的int迭代器的向量vec进行排序。我想使用以下比较函数:it1< it2当且仅当

index[it1 - int_vec.begin()] < index[it2 - int_vec.begin()]. 

其中index是指定迭代器键的第三个向量。现在,向量索引是A的构造函数的内部数组,而int_vec是类A的成员变量。我试图传递一个像这样的匿名函数:

std::sort(vec.begin(),flow.end(), [&index,&edges](const int_iter it1 ,const int_iter it2) -> bool
{ 
    index[it1 - int_vec.begin()] < index[it2 - int_vec.begin()]; 
})

但是我收到一个错误,告诉我无法捕获成员对象。确切的错误消息是:

'this' cannot be implicitly captured in this context
        index[it1 - int_vec.begin()] < index[it2 - int_vec.begin()];.

我也尝试过声明一个外部比较函数,但是我不清楚如何将两个固定值绑定到它(我读到了关于boost :: bind,看起来就像解决这个问题但是我宁愿不下载其他图书馆)。

1 个答案:

答案 0 :(得分:3)

那里有很多问题。

  1. 最明显的一点是您的代码缺少[this]

  2. vec.begin(),flow.end()

  3. 你不能从一个开始到另一个向量的结尾。

    这是更正后的代码:

    std::sort(vec.begin(),vec.end(), [this,&index,&edges](const int_iter it1 ,const int_iter it2) -> bool
    { 
        index[it1 - int_vec.begin()] < index[it2 - int_vec.begin()]; 
    })
    

    但是,您应该告诉我们您要实现的目标,并且我们确信我们可以找到更好的解决方案。使用其他向量的迭代器向量已经非常危险,在没有检查的情况下对它们进行减法只是粗心。

    不太危险的解决方案:

    std::vector<int> int_vec;
    std::vector<size_t> int_vec_order(int_vec.size());
    std::iota(int_vec_order.begin(), int_vec_order.end(), size_t(0));
    
    std::sort(int_vec_order.begin(), int_vec_order.end(), [&int_vec](const size_t a, const size_t b) {
      // apply your order to int_vec.at(a) and int_vec.at(b)
    });
    
    // output them
    for(const size_t i : int_vec_order) {
      // output int_vec.at(i)
    }