2 stl-algorithmen parallel



  • Ich habe einen vector mit ints und möchte zunächst das minimum und das maximum darin finden. danach möchte ich diese range mit den min/max werten skalieren ohne dabei ein zweites Mal über die Range laufen zu müssen. Wie kann ich das anstellen?

    Bislang sieht das hier so aus

    int max = 0;
    int min = 0;
    std::vector<float> newRange;
    
     auto minMax = std::minmax_element(range.cbegin(),range.cend());
        minPeak = *minMax.first;
        maxPeak = *minMax.second;
    
        std::transform(range.begin(),
                       range.end(),
                       std::back_inserter(newRange),
                       [this](int peakVal) -> float {
                         return float(peakVal - minPeak) / (maxPeak - minPeak);
                       });
    

    Würde gerne nur einmal über die Range laufen


  • Mod

    Geht nicht.



  • Ok Danke 🙂


  • Mod

    Ich habe einen alternativen Vorschlag. Kopiere einfach alle Werte in einen Container, und greife auf sie mittels eines Boost range adaptors zu.

    #include <vector>
    
    #include <boost/range/adaptor/transformed.hpp>
    
    int main() {
      using namespace std;
    
      vector<int> range{1, 2, 3, 4, 5};
    
      vector<int> newRange;
      int minPeak = numeric_limits<decltype(minPeak)>::min(),
          maxPeak = numeric_limits<decltype(maxPeak)>::max();
      newRange.reserve(range.size());
      for (auto x : range) {
        minPeak = min(minPeak, x);
        maxPeak = max(maxPeak, x);
        newRange.push_back(x);
      }
      auto new_range_view = newRange | boost::adaptors::transformed(
        [sub = minPeak, mul = 1/(float(maxPeak - minPeak))] (auto x) {return (x-sub) * mul;});
    }
    

    Wenn du nicht zu oft auf den neuen Container zugreifst, ist das womöglich effizienter.

    Ist prinzipiell nicht nötig, aber es wäre verwirrend, wenn Du keinen separaten Container bräuchtest, da sich dann ja die Kopie erübrigt und Du einfach die transformierten Werte ad-hoc dort berechnen könntest, wo Du sie benötigst.


  • Mod

    @SeppJ: Empfindest Du gepflegte Kleidung und tägliches Duschen als gerade so metrosexuell, dass Du es noch als Signatur, nicht aber als Signatur mit normaler Schriftgröße haben darfst, bevor wir Dich dafür hänseln?


Anmelden zum Antworten