Как отмечается в комментариях, вы проверяете только дубликаты family_name
, а не child_name
. Вы можете использовать std::find
для поиска std::vector
void add_child(map<string, vector<string>> &family, const string & family_name, const string & child_name)
{
auto f_it = family.find(family_name);
if (f_it != family.cend())
{
auto c_it = find(f_it->second.begin(), f_it->second.end(), child_name);
if (c_it == f_it->second.end())
{
f_it->second.insert(c_it, child_name);
}
else
{
cerr << "Error: Already has child <" << child_name << ">" << endl;
}
}
else
{
cerr << "Error: No family <" << family_name <<
"> for child <" << child_name << ">" << std::endl;
}
}
Или же вы можете использовать std::map<std::string, std::set<std::string>>
для обеспечения уникальности. Кроме того, вы можете использовать возвращаемое значение insert
, чтобы искать каждое имя только один раз.
void add_family(map<string, set<string>> &family, const string &name)
{
if (!family.insert({name, {}}).second)
{
cerr << "Error: Already has family <" << name << ">" << endl;
}
}
void add_child(map<string, set<string>> &family, const string & family_name, const string & child_name)
{
auto it = family.find(family_name);
if (it == family.cend())
{
cerr << "Error: No family <" << family_name <<
"> for child <" << child_name << ">" << std::endl;
} else if (!it->second.insert(child_name).second)
{
cerr << "Error: Already has child <" << child_name << ">" << endl;
}
}
Но я думаю, что этот дизайн не элегантен. Я бы вообще не стал беспокоиться о add_family
. Просто используйте инварианты map
и set
.
void add_child(map<string, set<string>> &family, const string & family_name, const string & child_name)
{
family[family_name].insert(child_name);
}