代码之家  ›  专栏  ›  技术社区  ›  Adrian

排序谓词不向索引对象传递引用?

  •  0
  • Adrian  · 技术社区  · 7 年前

    我有几个平行阵列。我不想创建一个新的数组来组合它们,所以我创建了一个索引数组,我想根据其中一个并行数组的内容进行排序。但是,如果我尝试获取传递的索引的索引,它们似乎不是对原始向量的引用。

    例如。:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <assert.h>
    
    using namespace std;
    
    int main()
    {
    
        vector<int> original = { 4, 3, 5, 2, 7 };
        vector<size_t> indices;
        size_t length = original.size();
        indices.reserve(length);
        for(size_t i = 0; i < original.size(); ++i) {
          indices.push_back(i);
        }
    
        sort(indices.begin(), indices.end()
          , [&] (size_t& lhs, size_t& rhs) {
            assert(&indices.front() <= &lhs && &lhs <= &indices.back());
            assert(&indices.front() <= &rhs && &rhs <= &indices.back());
            size_t iLhs = &lhs - &indices.front();
            size_t iRhs = &rhs - &indices.front();
            return original[iLhs] < original[iRhs];
        });
    
        for(auto index : indices) {
            cout << original[index] << endl;
        }
    
        return 0;
    }
    

    Demo

    a.out: main.cpp:22: main()::<lambda(size_t&, size_t&)>: Assertion `&indices.front() <= &lhs && &lhs <= &indices.back()' failed.

    为什么会这样?这是不是意味着 std::sort

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jarod42    7 年前

    我不明白你为什么要排队

        size_t iLhs = &lhs - &indices.front();
        size_t iRhs = &rhs - &indices.front();
    

    sort(indices.begin(), indices.end(),
         [&] (size_t lhs, size_t rhs) {
             return original[lhs] < original[rhs];
         });
    
    推荐文章