2016-04-05 17 views
0

Gegeben ein Paar Vektoren von Strukturen mit 2 Feldern x und y (wo kein Duplikat x in jedem Vektor gefunden wird), wie summiere ich jeden Wert Y für jedes passende Paar von X (oder verwende einfach Y, wenn kein passendes X vorhanden ist.) Gibt es einen einfachen Weg, dies zu tun? Ich habe versucht, das Sortieren, und es scheint, als gäbe es einen Weg geben muss dies effizient zu tun, ohne mit std :: mapC++/c Struct Array paarweise Summe

Beispiel:

v1 = [{x = 1, y = 2}, {x = 1000 , y = 3}, {x = 3, y = 2}]

v2 = [{x = 0, y = 0}, {x = 1, y = 1}, {x = 3, y = -3}]

PairWiseSum (v1, v2) = [{x = 0, y = 0}, {x = 1, y = 3}, {x = 3, y = -2}, {x = 1000, y = 3}]

struct mystruct{ 
    mystruct(int x, double y) { 
    X= x; 
    Y= y; 
    } 
    int X; 
    double Y; 
    bool operator < (const mystruct& other) const 
    { 
    return (x < other.x); 
    } 
}; 

std::vector<mystruct> PairWiseSum(std::vector<mystruct> s1,std::vector<mystruct> s2) 
{ 
    std::vector<mystruct> sumVector; 
    sort(s1.begin(), s1.end()); 
    sort(s2.begin(), s2.end()); 
    ... 
    return sumVector; 
} 
+0

Versuchen Sie, besser zu erklären, ich denke, die Leute verschwenden ihre Zeit zu verstehen, was Sie wollen. – Elyasin

Antwort

1

Gehen Sie durch s1 und s2, vergleicht das aktuelle Element in jeder Sammlung. Wenn der Wert x derselbe ist, fügen Sie sie zusammen hinzu. Andernfalls geben Sie den Wert mystruct mit dem kleineren Wert x aus.

std::vector<mystruct> PairWiseSum(std::vector<mystruct> s1, std::vector<mystruct> s2) 
{ 
    std::vector<mystruct> sumVector; 
    sort(s1.begin(), s1.end()); 
    sort(s2.begin(), s2.end()); 

    for (auto current1 = begin(s1), current2 = begin(s2); current1 != end(s1) || current2 != end(s2);) 
    { 
     if (current1 == end(s1)) 
      sumVector.push_back(*current2++); 
     else if (current2 == end(s2)) 
      sumVector.push_back(*current1++); 
     else if (current1->X < current2->X) 
      sumVector.push_back(*current1++); 
     else if (current1->X > current2->X) 
      sumVector.push_back(*current2++); 
     else 
     { 
      sumVector.emplace_back(current1->X, current1->Y + current2->Y); 
      current1++; 
      current2++; 
     } 
    } 
    return sumVector; 
} 
+0

Habe es versucht, funktioniert super! Ich werde natürlich ein paar Testfälle darauf werfen. Vielen Dank! –