我在一家IT公司申请了一个C++职位,他们给我发了一个测试作业。
任务是要实现一个区间映射赋值操作。我把我的解决方案发送给了他们,但它未通过第二个要求(正确的行为)。他们只是简单地告诉我我的代码没有通过所有的测试,并没有给出反馈。现在我想知道我可能做错了什么。当然,在发送我的解决方案之前,我进行了一些测试,我能想到的每一个测试都通过了。
现在我不知道我哪里出了问题,睡不着觉。
以下是我的代码:
任务是要实现一个区间映射赋值操作。我把我的解决方案发送给了他们,但它未通过第二个要求(正确的行为)。他们只是简单地告诉我我的代码没有通过所有的测试,并没有给出反馈。现在我想知道我可能做错了什么。当然,在发送我的解决方案之前,我进行了一些测试,我能想到的每一个测试都通过了。
现在我不知道我哪里出了问题,睡不着觉。
以下是我的代码:
void assign (const K & keyBegin, const K & keyEnd, const V & val )
{
if (!(keyBegin < keyEnd))
return;
auto nextInterval = --m_map.upper_bound(keyEnd);
auto inserted1 = m_map.end();
auto inserted2 = m_map.end();
if (nextInterval->second == val)
++nextInterval;
else if (nextInterval->first < keyEnd)
{
const V & nextValue = nextInterval->second;
++nextInterval;
inserted1 = nextInterval = m_map.emplace_hint(nextInterval, keyEnd, nextValue);
}
try
{
auto prevInterval = nextInterval;
--prevInterval;
if (keyBegin < prevInterval->first)
prevInterval = --m_map.upper_bound(keyBegin);
if (!(prevInterval->second == val))
{
if (prevInterval->first < keyBegin)
{
++prevInterval;
inserted2 = prevInterval = m_map.emplace_hint(prevInterval, keyBegin, val);
}
else
{
auto beforePrev = prevInterval;
--beforePrev;
if (beforePrev != m_map.end() && beforePrev->second == val)
prevInterval = beforePrev;
else
{
auto hint = m_map.erase(prevInterval);
inserted2 = prevInterval = m_map.emplace_hint(hint, keyBegin, val);
}
}
}
m_map.erase(++prevInterval, nextInterval);
}
catch (...)
{
if (inserted1 != m_map.end())
m_map.erase(inserted1);
if (inserted2 != m_map.end())
m_map.erase(inserted2);
throw;
}
}
你能帮我找到一个错误吗?
upper_bound
返回begin()
(对于空映射),则你会遇到未定义行为。 - undefined