练习:编写一个带有一对值的函数模板 表示未知类型的迭代器。找到那个价值 最常出现在序列中
我的工作:
template <typename Iterator>
typename std::iterator_traits<Iterator>::value_type
funkcija(Iterator begin, Iterator end)
{
typename std::iterator_traits<Iterator>::value_type Frequency;
typename std::iterator_traits<Iterator>::value_type frequencyTemp;
typename std::iterator_traits<Iterator>::value_type frequencyHighest = 0;
for ( Iterator tempIter = begin; tempIter != end; ++tempIter)
{
frequencyTemp = count (begin, end, *tempIter);
if (frequencyTemp > frequencyHighest)
{
frequencyHighest = frequencyTemp;
Frequency = *tempIter;
}
}
return Frequency;
}
int main()
{
std::vector<std::string> words;
words.push_back("ada");
words.push_back("dada");
words.push_back("mada");
words.push_back("ada");
words.push_back("dada");
words.push_back("ada");
words.push_back("kada");
std::vector<std::string>::iterator first = words.begin();
std::vector<std::string>::iterator last = words.end();
std::cout << "Most frequent value is " << funkcija(first,
last) << std::endl;
return 0;
}
编译很好,但是当尝试运行它时,我收到错误消息
Debug Assertion失败!
表达式:无效的空指针。
如果有人能告诉我我做错了什么,我将不胜感激。
答案 0 :(得分:3)
检查变量的类型:其中一些是错误的。
触发消息的具体问题是您尝试使用空指针初始化字符串 ToString
,如文字frequencyHighest
所指定的那样。 (即它试图使用带有C风格字符串的构造函数并将其复制到新构造的0
)
当你的程序崩溃并且你不知道导致它的原因时,你经常可以做的一件简单的事情就是继续删除程序的一部分直到它停止崩溃;然后你知道崩溃可能与你刚刚删除的部分有关。
你通常可以通过这种方式缩小原因 - 即使你不能这样做,它也会为你提供一个更好的示例程序,以便在你寻求帮助时发布。
虽然正如评论所说,调试器会让它变得更加简单。