Quand j'écris comme ça swap(a,b); ça va.

Quand j'écris comme ça swap(&c[0],&d[0]);, il y a une erreur. Quelqu'un peut me dire pourquoi?

#include<iostream>
#include<algorithm>
using namespace std;

int main(void){
    int *a;
    int *b;
    int c[]={1,2};
    int d[]={3,4};
    a=&c[0];
    b=&d[0];
    swap(a,b);// it is ok
    //swap(&c[0],&d[0]);// it is error why
    cout<<a[0]<<" "<<b[0]<<endl;
    cin.get();
}
c++
0
gavin du 2 avril 2020 à 07:25

4 réponses

Meilleure réponse

Remplacez swap(&c[0],&d[0]) par swap(c[0], d[0]).

&c[0] et &d[0] sont des rvalues (objets temporaires de type int*), mais vous ne pouvez échanger que des lvalues.

Vous pouvez swap(a, b) car a et b sont des lvaleurs, a après l'échange pointera vers d[0] et b vers {{ X6}}, swap(a, b) n'échangerait pas les valeurs dans un tableau, c'est une différence de comportement (grâce au commentaire de MM avec un avis).

0
fas 2 avril 2020 à 04:52

User3365922 est correct sur la syntaxe si vous souhaitez permuter le contenu de c [0] et d [0].

Juste pour ajouter parce que votre échantillon de code est un peu bizarre. std :: swap (a, b) dans votre code n'échange pas réellement le contenu c [0] et d [0]. Il échange les pointeurs a et b. Je mentionne cela car il semble que vous ayez remplacé std :: swap (& c [0], & d [0]) par std :: swap (a, b) - qui n'est pas en fait équivalent (c'est une hypothèse, mon mauvais s'ils n'étaient pas censés être équivalents).

Je ne suis pas tout à fait sûr de votre objectif, mais std :: swap (c [0], d [0]) parviendra à échanger la première entrée de c avec la première entrée de d (en laissant la deuxième entrée telle quelle) . Si vous vouliez réellement échanger entièrement le contenu des tableaux dans l'exemple ci-dessus, vous pouvez également faire std :: swap (c, d).

1
Dan 2 avril 2020 à 04:45

Les arguments de std::swap() sont deux pointeurs entiers, pas deux adresses d'un tableau avec un index.

Pour échanger les valeurs normales singulières int, vous devrez utiliser un pointeur (appel par référence), mais pour un tableau, vous pouvez le passer directement (comme l'adresse de base du tableau est prise) pour lequel vous auriez pu utiliser {{X1 }}. Utiliser & pour référencer le tableau (c'est-à-dire utiliser &c[0],&d[0]) avec la fonction acceptant un type int * entraînerait une discordance de type d'argument, les valeurs transmises étant des rvalues de type int *, qui ne peuvent pas être échangés. (alors que les valeurs comme c,d et c[index],d[index] peuvent être permutées)

L'erreur que vous avez reçue doit être:

main.cpp: 12: 13: erreur: pas de fonction correspondante pour l'appel à «swap (int *, int *)» swap (& c [0], & d [0]); ^

Cela concerne l'initialisation non valide d'une référence non-const de type int*& à partir d'une rvalue de type int*, qui est incluse dans le message d'erreur.

Si ce que vous voulez considérer comme paramètres sont en effet les adresses des tableaux, ce serait votre fonction:

void swap_array_elements(int a, int b, int arr[], int arr2[]) 
{
  int temp = arr[a];
  arr[a] = arr2[b];
  arr2[b] = temp;
}

Notez que les deux premiers arguments utilisés ici sont des indices des deux tableaux passés respectivement comme troisième et quatrième argument. Cela permutera entre les deux éléments dont vous avez besoin parmi les deux tableaux.
Exemple:

#include <iostream>
void swap_array_elements(int a, int b, int arr[], int arr2[]) 
{
  int temp = arr[a];
  arr[a] = arr2[b];
  arr2[b] = temp;
}
int main()
{ int array1[]={42,56}, array2[]={63,89};
  swap_array_elements(0,1,array1,array2); // swapping element with index 0 in array1 (42) with element with index 1 in array2 (89)
  std::cout<<array1[0]<<" "<<array2[1]; // 89 42
  return 0;
}
1
Anirban166 2 avril 2020 à 07:51

Fonction swap

  template <class T> void swap ( T& a, T& b )
  {
     T c(a); a=b; b=c;
  }     

Et a=&c[0]; b=&d[0]; après swap(a,b);

  a will pointing to d[0]
  b will pointing to c[0]

Et ici swap(&c[0],&d[0]); le prototype ne correspond pas à la fonction de swap actuelle. Le prototype requis est

  swap(int*,int*)

Il n'y a donc pas de fonction correspondante à appeler, donc le compilateur renvoie une erreur.

0
Sri lakshmi kanthan 2 avril 2020 à 05:05