gpt4 book ai didi

c++ - 将两个字符串中的相似性写入新动态数组的最简单方法

转载 作者:行者123 更新时间:2023-11-30 02:46:32 25 4
gpt4 key购买 nike

我有一个函数,我想比较两个数组,找到匹配项,然后创建第三个数组。该函数找到了比较,但是当我尝试返回一个对象时,程序中止了。我最初的想法是 c1.numMembers 和 c2.numMembers 具有不同的值可能会导致我的循环出现故障。任何帮助表示赞赏。这是我的。

Club mergeClubs(Club& c1, Club& c2)
{
Club combined;
combined.clubName = c1.clubName + "/" + c2.clubName;
string* x = new string[combined.numMembers];
for(int i = 0;i<c1.numMembers;i++)
{
for(int k =0;k<c2.numMembers;k++)
{
if(c1.members[i]==c2.members[k])
{
x[combined.numMembers] = c1.members[i];
combined.numMembers++;
}
}
}
combined.members = x;


return combined;
}

谢谢大家的回答。我知道使用 vector 会更简单,但我根本不允许更改有关初始类的任何内容,其中 members* 是我们必须在每个 Club 类型中使用的动态数组。我更改了我的代码,并且我拥有它,所以最终数组 combined.members 中有正确的成员,但我仍然收到返回它的错误。这是我的新代码。

Club mergeClubs(Club& c1, Club& c2)
{
//I changed the arrays to vectors to sort them and find the duplicates, then wrote it back into an array. inefficient yes, but using vectors
//in the first place would have made the project 1000000000000x easier.
Club combined(c1.clubName + "/" + c2.clubName);
vector<string> x1;
vector<string> x2;
vector<string> combine;
for(int i = 0;i<c1.numMembers;i++)
{
x1.push_back(c1.members[i]);
}
for(int i = 0;i<c2.numMembers;i++)
{
x2.push_back(c2.members[i]);
}
for(int i = 0;i<x1.size();i++)
{
for(int j = 0;j<x2.size();j++)
{
if(x1[i]==x2[j])
{
combine.push_back(x1[i]);
}
}
}
for(vector<string>::const_iterator i = combine.begin(); i != combine.end(); ++i)
combined.numMembers = combine.size();
combined.members = &combine[0];


return combined;
}

相信我,我知道这是多么低效。

最佳答案

您可能需要考虑为您的 members 使用容器字符串。如果您要使用 std::set例如,您可以执行以下操作:

std::set<std::string> a, b, c;
// assume a and b contain some strings
std::set_intersection(
a.begin(), a.end(),
b.begin(), b.end(),
std::inserter(c, c.end())
);

你也可以使用 vector s(或另一个容器),你只需要确保它们是 sort在创建交集之前编辑。


您的新代码的问题在于您正在分配 combined.members指向函数返回时将被删除的指针(属于 combine )。您仍然需要创建一个 string 的数组s 并从 vector 复制它们,如果你想走这条路(大概你在某个时候想到了这一点,但是你在 container 上的循环似乎没有任何作用)。

您仍然可以在原始指针上使用库算法,因此如果您不能更改结构,更好的解决方案可能类似于以下内容:

假设Club看起来像这样

struct Club
{
std::string clubName;
std::string* members;
int numMembers;
};

Club mergeClubs(Club& c1, Club& c2)
{
Club combined{
c1.clubName + "/" + c2.clubName,
new std::string[c1.numMembers + c2.numMembers],
0
};

std::sort(c1.members, c1.members + c1.numMembers);
std::sort(c2.members, c2.members + c2.numMembers);

auto end = std::set_intersection(
c1.members, c1.members + c1.numMembers,
c2.members, c2.members + c2.numMembers,
combined.members
);

combined.numMembers = end - combined.members;

return combined;
}

And trust me, I know how inefficient this is.

这不仅与效率有关,我仍然会选择答案顶部的代码,即使使用标准容器比处理数组慢(通常不是,特别是如果您使用 vector s) ,因为它更容易编写、阅读和维护。

关于c++ - 将两个字符串中的相似性写入新动态数组的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23484204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com