слияние контейнеров
От: cthutq00  
Дата: 16.04.06 18:15
Оценка:
извиняюсь за большой вопрос

возникли сложности с подходящим алгоритмом

есть структура

enum T {A, B, C, D, E};
struct S{
    T type;
    int count;
    S (T t, int c) : type (t), count (c){;}

    bool operator == (const S& s){
        return type == s.type;
    }
    void operator += (const S& s){
        count += s.count;
    }
    void operator << (const S& s){
        type = s.type;
        count += s.count;
    }

};

const S operator+ (const S& lhs, const S& rhs){
    return S (lhs.type, lhs.count + rhs.count);
}

1. Есть вектор объектов

    std::vector<S> v1(3);
    std::vector<S> v2(3);


нужно каждый элемент 1 списка объединить с каждым элементом второго
я смог это сделать только так

    std::transform (v1.begin(), v1.end(),
            v2.begin(), v1.begin(),
            std::plus<S>());


но для каждой пары создается новый объект и перезаписывается на место в 1 векторе
получается слишком много вызовов конструкторов и деструкторов

2. есть список

    std::list<S> list;
    list.push_back(S (A, 50));
    list.push_back(S (B, 200));
    list.push_back(S (C, 300));
    list.push_back(S (A, 50));

нужно объединить равные объекты
тоесть должно получиться в списке
S (A, 100);
S (B, 200);
S (C, 300);

3. нужно сделать тоже если они в разных списках

    std::list<S> list1;
    list1.push_back(S (A, 50));
    list1.push_back(S (B, 200));
    list1.push_back(S (C, 300));

    std::list<S> list2;
    list2.push_back(S (A, 50));
    list2.push_back(S (E, 500));


тоесть А из второго списка должен объединиться с А из первого списка и удалиться из 2
в результате должно получиться

list1;
S (A, 100);
S (B, 200);
S (C, 300);

list2;
S (E, 500);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.