Du bist nicht angemeldet.

Werbeanzeige

1

08.03.2020, 19:11

C++ Minimum in jeder Reihe eines 2D-Vektors bekommen

Hallo. Ich hab ein neues Problem. Es soll eine Funktion geschrieben werden die einen 2D Vektor bekommt. Als Rückgabewert
soll sie das Minimum jeder Reihe liefern. Also z.B.:
{1,2,3,4,5}, // Minimum der Reihe ist 1
{5,6,7,8,9}, // Minimum der Reihe ist 5
{20,21,34,56,100} // Minimum der Reihe ist 20

1 + 5 + 20 = 26

Also soll 26 zurückgegeben werden.

Es ist übrigens gewährleistet das es keine leeren Vektoren gibt und sie immer positive Werte enthalten.

Mein Code bisher:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int sum_of_minimums(const std::vector<std::vector<int>> &numbers)
{
    int sum = numbers[0][0];
    
    for (int y=0; y < 5; y++)
    {
      for (int x=0; x < 5; x++)
      {
        if (sum > numbers[y][x])
          sum = numbers[y][x];
      }
    }
    
    return sum;
}


Das dürfte nur Funktionieren wenn jede Reihe des Vektors 5 Elemente hat. Auch liefert es nur das Minimum alle Zahlen und nicht für jede Reihe.
Wie schaffe ich es jetzt, dass die größe des Vektors flexibel sein kann und wie bekomme ich das Minimum jeder Reihe?

2

09.03.2020, 10:36

Sag mal, kann es sein, dass wir hier deine Hausaufgaben machen sollen? Das ist nicht die erste Frage dieser Art, die du stellst.

Lern einfach, die Dokumentation zu benutzen (googeln) und nutze eine IDE wie z.B. Visual Studio, dann siehst du auch die Methoden, die es für std::vector gibt, wie z.B. size().

Außerdem rechnest du gerade das Minimum aller Elemente aus statt pro Reihe.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

David Scherfgen

Administrator

Beiträge: 10 334

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

09.03.2020, 10:58

Zerlege das Problem in Teilprobleme: Mach dir eine Funktion, die für einen einzelnen Vektor das Minimum berechnet. Die benutzt du dann in deiner anderen Funktion, um die Summe der Minima zu berechnen.

4

20.03.2020, 23:01

Habe jetzt die Lösung. Mein Problem war, dass ich nicht wusste das man foo.size() auf einzelne Reihen im 2D-Vektor verwenden kann. Ich dachte, dass man mit foo.size() die Anzahl aller Elemente im 2D-Vektor bekommt.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int sum_of_minimums(std::vector<std::vector<int>>& numbers)
{
    vector<int> myVec = {0};
    int Temp = 0;

    for (int y=0; y < numbers.size(); y++) {
        sort(numbers[y].begin(), numbers[y].end());
        myVec.push_back(numbers[y][0]);
    }

    for (int i=0; i < myVec.size(); i++)
        Temp += myVec[i];

    return Temp;
}

5

21.03.2020, 15:14

Sortieren, um das kleinste Element zu bekommen, ist aber auch nicht die beste Idee. Du solltest mal etwas über Komplexitätstheorie lesen, wenn du die Zeit dazu hast.

Wieso du die Zahlen in einem zweiten Vektor speicherst, statt direkt zu addieren, erschließt sich mir auch nicht.

Statt

C-/C++-Quelltext

1
2
for (int i=0; i < myVec.size(); i++)
  Temp += myVec[i];
kannst du auch Folgendes schreiben:

C-/C++-Quelltext

1
2
for (const auto& i : myVec)
  Temp += i;
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

6

21.03.2020, 18:29

Danke für die Tipps. Habe die Funktion nochmal überarbeitet.

Quellcode

1
2
3
4
5
6
7
8
int sum_of_minimums(std::vector<std::vector<int>>& numbers)
{
    int Temp = 0;
    for (auto i : numbers)
        Temp += *min_element(i.begin(), i.end());

    return Temp;
}


Edit: Habe die Funktion nochmal geändert.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »justmytwocents« (21.03.2020, 18:44)


7

21.03.2020, 20:34

Wenn du jetzt noch auto& oder const auto& statt auto nimmst, wird der Vektor auch referenziert statt kopiert.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

8

22.03.2020, 13:56

oder einfach per std::accumulate:

C-/C++-Quelltext

1
2
3
4
5
6
7
int sum_of_minimums(const std::vector<std::vector<int>>& numbers)
{
    return std::accumulate(begin(numbers), end(numbers), 0, [](int sum, const auto& row)
    {
        return sum + *std::min_element(begin(row), end(row));
    });
}

9

23.03.2020, 07:57

oder einfach per std::accumulate

Einfach? Der Code ist länger und unverständlicher.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Werbeanzeige