如何对包含const值的向量进行排序

How to sort a vector containing const values

本文关键字:向量 排序 包含 const      更新时间:2023-10-16

我有一个像这样的向量,我想对它进行排序:

#include <iostream>
#include <vector>
#include <algorithm> 
using namespace std;
int main()
{
    const int a =10;
    int b = 20;
    pair<const int, int> constPair1(a,b);
    b=30;
    pair<const int, int> constPair2(a,b);
    vector<pair<const int, int>> vec{constPair1,constPair2};
    sort(vec.begin(),vec.end());
    return 0;
}

不幸的是,由于const值的原因,上面的排序无法编译。有什么方法可以对这个向量排序吗?或者我被困在创建一个新的向量和复制值?

在c++ 03中,std::vector中的元素必须是可复制赋值和可复制构造的。带有const成员的pair不满足这一要求,因此无效。编译器拒绝它是正确的。

在c++ 11中,std::vector中的元素必须是可移动赋值和可移动构造的。带有const成员的pair不能移动,因此会导致无效代码。

我决定利用const_cast, override=swap来进行排序工作:

template <class KEY, class VALUE>
class Wrapper {
    std::pair<const KEY, VALUE> d_data;
  public:
    Wrapper& operator=(const Wrapper &rhs) {
        const_cast<KEY&>(d_data.first) = rhs.d_data.first;
        d_data.second = rhs.d_data.second;
    }
    std::pair<const KEY, VALUE>& data() { return d_data; }
    std::pair<const KEY, VALUE> const& data() const { return d_data; }
};
template <class KEY, class VALUE>
void swap(Wrapper<KEY, VALUE>& a, Wrapper<KEY, VALUE>& b) {
    using std::swap;
    swap(const_cast<KEY&>(a.data().first), const_cast<KEY&>(b.data().first));
    swap(a.data().second, b.data().second);
}