繁体   English   中英

我想知道临时对象(name_compare())是按值传递还是通过引用 std::sort

[英]I wonder that if the temporary object(name_compare()) is passed by value or by reference to std::sort

我想知道临时对象(name_compare())是按值传递还是通过引用 std::sort 传递。

对于这个问题的任何提示,我将不胜感激。

 struct Record {
        string name;
        // ...
    };
    struct name_compare {   // compare Records using "name" as the key
        bool operator()(const Record& a, const Record& b) const
            { return a.name<b.name; }
    };
    void f(vector<Record>& vs)
    {
        sort(vs.begin(), vs.end(), name_compare());
        // ...
    }  

std::sort推导出Compare类型并按值接受它:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );

在大多数情况下,这意味着按值接受比较器。

但这没关系,因为

  1. 比较器通常是一个空的 object ,只有一个operator() ,所以传递它实际上是一个空操作;
  2. 编译器可以完全优化掉临时 object 创建;
  3. 即使它不是空的,复制一个 object 一次对于随后的排序操作来说也可以忽略不计

在您的情况下, struct name_compare没有成员,空的 object 也是如此。

可以通过将比较器类型包装在std::ref中来强制扣除比较器类型作为参考。

顺便说一句,比较器不必是 class,也可以是staticfriend function:

struct Record {
    string name;
    static bool compare(const Record& a, const Record& b) {
        return a.name < b.name;
    }
    void f(vector<Record>& vs) {
        sort(vs.begin(), vs.end(), Record::compare);
    }
};

但更好的是,您可以依赖内置的std::less实现并简单地为您的类型定义operator<

struct Record {
    string name;
    bool operator< (const Record& that) const {
        return name < that.name;
    }
    void f(vector<Record>& vs) {
        sort(vs.begin(), vs.end()); // operator < is used automatically
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM