Intersección y unión de dos cuerdas.

Tengo que eliminar cualquier aparición de la cadena 2 en la cadena 1 y también encontrar la intersección de dos cadenas.

Esto es lo que he intentado:

#include "stdafx.h" #include "stdio.h" #include "conio.h" #include "string.h" class operation { public: char string1[100]; char string2[50]; operation(){}; operation(char a[100], char b[50]); operation operator+(operation); operation operator-(operation); operation operator*(operation); }; operation::operation(char a[100], char b[50]) { strcpy(string1, a); strcpy(string2, b); } operation operation::operator +(operation param) { operation temp; strcpy(param.string1, temp.string1); strcpy(param.string2, temp.string2); strcat(temp.string1, temp.string2); return (temp); } operation operation::operator -(operation param) { operation temp; strcpy(param.string1, temp.string1); strcpy(param.string2, temp.string2) ; for (int i = 0; i<strlen(temp.string2); i++) { temp.string1.erase(i, 1); } return (temp); } operation operation::operator *(operation param) { operation temp; strcpy(param.string1, temp.string1); strcpy(param.string2, temp.string2); char result[50]; for(int i = 0; i<strlen(temp.string2); i++) { if( temp.string1.find( temp.string2[i] ) != string::npos ) result = result + temp.string2[i]; } return (temp); } 

Recibo errores de comstackción y tampoco estoy seguro de que lo que estoy intentando sea correcto o no.

Los errores son los siguientes:

 C2228: left of .erase must have class/struct/union C2228: left of .find must have class/struct/union 

Felizmente, en C ++, los algoritmos de diferencia , intersección y unión ya se han implementado en la biblioteca estándar. Estos se pueden aplicar a cadenas como cualquier clase de contenedor.

Aquí hay una demostración (podría hacer esto con matrices de caracteres simples, pero estoy usando std::string para mayor claridad):

 #include  #include  #include  int main() { std::string string1 = "kanu"; std::string string2 = "charu"; std::string string_difference, string_intersection, string_union; std::sort(string1.begin(), string1.end()); std::sort(string2.begin(), string2.end()); std::set_difference(string1.begin(), string1.end(), string2.begin(), string2.end(), std::back_inserter(string_difference)); std::cout << "In string1 but not string2: " << string_difference << std::endl; std::set_intersection(string1.begin(), string1.end(), string2.begin(), string2.end(), std::back_inserter(string_intersection)); std::cout << "string1 intersect string2: " << string_intersection << std::endl; std::set_union(string1.begin(), string1.end(), string2.begin(), string2.end(), std::back_inserter(string_union)); std::cout << "string1 union string2: " << string_union << std::endl; } 

¡Ejecutarlo!

Cómo implementar esto en su clase de operation se deja como un ejercicio.

Si strcpy( string1... comstack entonces string1 es un char* y no un std::string . Parece que estás mezclando la funcionalidad de C y C ++ para los strings. Elige uno y quédate con él (yo diría que std::string desde estas haciendo C ++)

  1. Esto es C ++ (no C: C no tiene sobrecarga de operadores)

  2. Debe mostrarnos su definición de clase antes de que podamos ayudar a identificar el error de comstackción.

  3. Si no tiene una definición de clase para “operador”, eso explica el error 🙂

  4. Si está utilizando C ++, probablemente debería usar la “cadena” estándar de C ++ (en lugar de las matrices C “char []”). Usar “cadena” también afectará su código de implementación.

  5. P: Esto no sería una tarea, ¿verdad? Si es así, por favor agregue “tarea” a sus tags.

Gracias de antemano .. PSM