我给一家IT公司发了一份C++职位的申请,他们给我发了一份测试作业。
任务是实现一个区间Map分配操作。我把我的解决方案发送给他们,但是它没有通过第二个要求(正确的行为)。他们除了声明我的代码没有通过他们所有的测试之外,没有给予任何反馈。现在我想知道我做错了什么。当然,在发送我的解决方案之前,我做了一些测试,我能想到的每一个测试都通过了。
现在我睡不着觉,不知道哪里会搞砸。
下面是我的代码:
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;
}
}
你能帮我找一个错误吗?
7条答案
按热度按时间pod7payv1#
您可以通过递减Map的开始来获得UB:
Demo
你下面的测试也很奇怪:
beforePrev在递减时不能为
end()
。看起来你可以用
Demo
sg24os4d2#
**首先编写测试代码:**这是为了测试类型需求
现在实施
另一种解决方案
mrfwxfqh3#
Vivek上面的两个解决方案都不起作用。这是我能想到的最简单和最短的实现:
ss2ws0br4#
zbsbpyhn5#
这是我的解决方案,可以替换上面问题中的
assign
函数。原来的问题是要求将其实现为类成员函数,但这里的问题省略了类部分。因此,您可以忽略template
和interval_map<K, V>
,以便能够匹配问题中的解决方案,就像本页中的其他答案一样。在实现的时候,我把
assign
函数想象成在一个条带中的现有颜色上绘制一个新颜色,这里的map
只包含条带中每个绘制区域的起始点和颜色(即value
)。顺便说一句,我还编写了一个verify函数,可以在每个
assign
之后调用该函数来验证整个Map的有效性,希望这可以帮助理解Map满足跨assign
操作的属性。7cwmlq896#
请尝试以下代码:
ykejflvf7#
下面是main()中测试的完整工作代码**(但雇主说模板类型的使用不正确)**