Errore di compilazione

Scusate scorrendo le soluzioni delle nazionali dell’anno scorso e mi sono imbattuto in questa soluzione di “grattacieli”:

#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;

typedef long long ll;
typedef pair<long long, long long> ii;
vector<vector<ii>> nodes;

long long int costruisci(int N, int M, vector<long long>& H, vector<int>& A, vector<int>& B, vector<int>& C)
{
  vector<vector<ii>> nodes;
  nodes.assign(N, vector<ii>());

  for(int i = 0; i < A.size(); i++)
    nodes[A[i]].push_back({B[i], C[i]});

  for(int i = 0; i < N; i++)
  {
    for (auto [node, diff] : nodes[i]) {
      H[node] = min(H[node], H[i] + diff);
    }
  }

  return accumulate(H.begin(), H.end(), 0LL);
}

Mi ha incuriosito questa parte di codice ed ero curioso di capire ciò che facesse:

for (auto [node, diff] : nodes[i]) {
  H[node] = min(H[node], H[i] + diff);
}

però mi da degli errori sul mio compilatore e perciò sono andato a sottoporre il codice è non da alcun tipo di errore di compilazione, qualcuno di voi sa il motivo? Va inclusa qualche opzione di compilazione particolare?

Quella è una sintassi particolare del C++17, puoi utilizzarla aggiungendo la flag -std=c++17 al compilatore.
Se il tuo compilatore non supporta questo standard dovresti aggiornarlo. Su windows puoi scaricare l’ultima versione di MinGW-w64.

1 Mi Piace

Non mi riconosce il flag quando lo vada ad aggiungere e , se non erro, ho la versione più recente di Dev c++ (il compilatore che di norma utilizzo),comunque per quello che riguarda questa particolare sintassi mi sapresti dire come funziona in parole povere.

Praticamente quella funzionalità ti permette di “scomporre” un oggetto di tipo pair o tuple. Prima del C++17 bisognava fare:

pair<int, int> p = {42, 42};
int x = p.first;
int y = p.second;

tuple<int, int, int> t = {42, 42, 42};
int a = get<0>(t);
int b = get<1>(t);
int c = get<2>(t);

Dal C++17 in poi si può invece fare:

pair<int, int> p = {42, 42};
auto [x, y] = p;

tuple<int, int, int> t = {42, 42, 42};
auto [a, b, c] = t;

Come ho appunto detto prima, se il tuo compilatore non supporta questo standard devi aggiornarlo. Sopra ho anche messo il link dove puoi scaricare una versione più aggiornata.

1 Mi Piace

ok grazie mille, giusto un chiarimento quindi io a quel punto potrei fare una cosa del genere:

pair<int,int>p={4,4}
auto [a,b]=p;
v[a]=b;

dove v è un vettore ma non è quello l’importante, ma la domanda è: io facendo questo ho creato due variabili “a” e “b” con contengono rispettivamente il primo e il secondo valore di “p” e perciò le posso usare e modificare successivamente come se fossero delle normali variabili?

Esattamente, nella documentazione che ho linkato sopra trovi altri esempi.

1 Mi Piace