Могу ли я использовать вектор в качестве индекса в структуре карты в C ++? - PullRequest
2 голосов
/ 07 мая 2010

Я пытался сделать что-то подобное, но оно не компилируется:

class point
{
    public:
        int x;
        int y;
};



int main()
{

    vector<point> vp1;
    vector<point> vp2;
    vector<point> vp3;

    map < vector<point>, int > m;

    m[vp1] = 1;
    m[vp2] = 2;
    m[vp3] = 3;

    map < vector<point>, int >::iterator it;
    for (it=m.begin(); it!=m.end(); it++)
    {
        cout<<m[it->first]<<endl;
    }
    return 0;
}

Ответы [ 5 ]

6 голосов
/ 07 мая 2010

Вы можете использовать что угодно в качестве типа индекса для std::map, если он поддерживает operator< (который может быть определен как автономная функция - не обязательно должен быть функцией-членом, покакак вы можете написать a < b для a и b, являющихся экземплярами вашего типа интересов) с обычной семантикой (антирефлексивная, транзитивная, ...).Или вы можете передать двоичную функцию с той же семантикой, чтобы использовать ее вместо <, если это вам подходит.

4 голосов
/ 07 мая 2010

Можно, но тип, используемый в качестве ключа на карте, должен быть сопоставим, либо с использованием operator<, либо с использованием функции сравнения / функтора, который вы указали в качестве третьего параметра шаблона для типа карты.

1 голос
/ 08 мая 2010

Да, вы можете. Векторы, как и все контейнеры, сравнимы. В результате map отсортирует векторы в лексикографическом порядке.

Проблема в том, что point несопоставимо. Вы должны определить порядок сортировки для points, а затем это, в свою очередь, определит лексикографический порядок для vector<point>.

class point
{
    public:
        int x;
        int y;
};

bool operator<( point const &l, point const &r ) {
    return l.x < r.x? true
         : r.x < l.x? false
         : l.y < r.y;
}

Более простое решение - использовать std::pair вместо определения собственного point.

typedef pair< int, int > point; // point::first = x, point::second = y
   // pair is already comparable; order defined as in previous example
typedef vector<point> pointvec; // OK
0 голосов
/ 07 мая 2010

Вы должны объявить operator<. Это будет выглядеть так (имейте в виду, что три вектора в вашем примере кода на самом деле выглядят одинаково):

bool operator<(const vector<point>& left, const vector<point>& right)
{
    return left.size() < right.size();
}
0 голосов
/ 07 мая 2010

Вы не определили функцию для сравнения vector<point> Для карт требуются ключи, проверяющие эквивалентность и сравнение.

...