交叉和两个字符串的并集

时间:2011-10-29 02:40:17

标签: c++

我必须消除字符串1中出现的任何字符串2,并且还要找到两个字符串的交集。

以下是我的尝试:

#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);

}

我收到编译错误,而且我不确定我的尝试是否正确。

错误如下:

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

3 个答案:

答案 0 :(得分:7)

令人高兴的是,在C ++中设置differenceintersectionunion算法已在标准库中实现。这些可以应用于任何容器类的字符串。

以下是演示(您可以使用简单的char数组执行此操作,但为了清晰起见,我使用std::string

#include <string>
#include <algorithm>
#include <iostream>

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;
}

Run it!

如何在operation课程中实现这一点,这是一项练习。

答案 1 :(得分:1)

如果strcpy( string1...已编译,则string1char*而不是std::string。您似乎正在为字符串混合使用C和C ++功能。选择一个并坚持下去(我说std::string,因为你正在做C ++)

答案 2 :(得分:0)

  1. 这是C ++(不是C:C没有运算符重载)

  2. 在我们帮助识别编译错误之前,您需要向我们展示您的类定义。

  3. 如果您没有“operator”的类定义,那么只能解释错误:)

  4. 如果您使用的是C ++,则应该使用标准C ++“string”(而不是C“char []”数组)。使用“string”也会影响您的实现代码。

  5. 问:这不是家庭作业,不是吗? 如果是这样,请在标签上添加“作业”。

  6. 提前完成.. PSM