C++运算符重载的有关问题

C++运算符重载的问题
C++在重载运算符的时候什么要用const
今天遇到个例子。
C/C++ code

class unit
{
public:
    void set_v1(int v);
    void set_v2(int v);
    int get_v1();
    int get_v2();
    unit():v1(0),v2(0){}
    friend ostream& operator <<(ostream& out,unit& unit);
    bool operator <(const unit& u) const;
private:
    int v1;
    int v2;
};


这里bool operator <(const unit& u) const没有报错,我之前是写成bool operator <(unit& u) ;报错。后来进去看了下是要const修饰,我想问下。重载什么运算符需要用到const?


还有个问题见代码:
C/C++ code

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <utility>
#include <algorithm>
#include <vector>
#include <functional>

/*http://blog.pfan.cn/wfxsky/28836.html
当你的容器中元素时一些标准类型(int float char)或者string时,你可以直接使用这些函数模板。
但如果你时自己定义的类型或者你需要按照其他方式排序,
你可以有两种方法来达到效果:一种是自己写比较函数。另一种是重载类型的'<'操作赋。

bool operator <(const unit& u) const;must overload as const
*/
using namespace std;

class unit
{
public:
    void set_v1(int v);
    void set_v2(int v);
    int get_v1();
    int get_v2();
    unit():v1(0),v2(0){}
    friend ostream& operator <<(ostream& out,unit& unit);
    bool operator <(const unit& u) const;//重载<作为比较算子
private:
    int v1;
    int v2;
};

void unit:: set_v1(int v)
{
    v1 = v;
}

void unit:: set_v2(int v)
{
    v2 = v;
}

int unit::get_v1()
{
    return v1;
}

int unit::get_v2()
{
    return v2;
}

bool unit:: operator<(const unit &u1) const
{
    return (v1<u1.v1);
}

ostream& operator <<(ostream& out,unit& unit)
{
    out<<unit.v1<<"  "<<unit.v2<<endl;
    return out;
}

bool less_compare(const unit& u1, const unit& u2)
{
    return (u1.get_v1()<u2.get_v1());
}


int main(void)
{
    vector<unit> units;
    srand(time(NULL));
    int i = 10;
    while (--i>=0)
    {
        unit u;
        u.set_v1(rand()%100+1);
        u.set_v2(rand()%100+1);
        units.push_back(u);
    }
    vector<unit>:: iterator iter = units.begin();
    while (iter!=units.end())
    {
        cout<<*iter;
        iter++;
    }

    puts("after sort with overload <:");
    sort(units.begin(),units.end());
    iter = units.begin();
    while (iter!=units.end())
    {
        cout<<*iter;
        iter++;
    }

    puts("after sort with self function less_compare:");
    sort(units.begin(),units.end(),less_compare);
    iter = units.begin();
    while (iter!=units.end())
    {
        cout<<*iter;
        iter++;
    }
    return 0;
}




这里编译
C/C++ code

bool less_compare(const unit& u1, const unit& u2)
{
    return (u1.get_v1()<u2.get_v1());
}


这一段代码出错,出错的信息是
/home/revival/code_blocks_project/class_vector_sort/main.cpp||In function ‘bool less_compare(const unit&, const unit&)’:|
/home/revival/code_blocks_project/class_vector_sort/main.cpp|66|error: passing ‘const unit’ as ‘this’ argument of ‘int unit::get_v1()’ discards qualifiers|
/home/revival/code_blocks_project/class_vector_sort/main.cpp|66|error: passing ‘const unit’ as ‘this’ argument of ‘int unit::get_v1()’ discards qualifiers|
||=== Build finished: 2 errors, 0 warnings ===|

我看到this我就把两个数据成员改成public然后把函数改成:
C/C++ code

bool less_compare(const unit& u1, const unit& u2)
{
    return (u1.v1<u2.v1);
}


就不报错了。但是我还是没明白什么意思。
麻烦各位大牛了。。。

------解决方案--------------------