c++ - 在列表中查找最常见的元素(C++ STL)?

标签 c++ list vector stl iterator

我有一个程序,我必须在一个整数列表中找到最常见的元素。我使用下面的程序执行此操作,但问题是,我怀疑删除函数与 countRepetition() 函数中的迭代器递增混淆了。我的问题是如何解决这个问题,或者如果这不是问题是什么?

提前致谢。

最佳答案

您有几个问题。首先,正如您所怀疑的那样,是 erase 的错误使用。当您删除迭代器时,它会使迭代器失效。之后对迭代器的任何使用都是未定义的行为。由于 erase 返回下一个有效的迭代器,您可以做的是像这样重组循环

for (START = l.begin(); START != l.end();) { // do not increment here
    if (*START) {
        counter++;
        START = l.erase(START); // erase and get next
    }
    else
    {
        ++START; // go to next
    }
}

所以现在至少你循环遍历了列表。不幸的是,您在 main 中仍然有一个无效的迭代器。您将 STARTmain 传递给 countRepetition 并且当该迭代器从列表中删除时,您将拥有一个无效的迭代器。您需要做的是每次迭代都从列表中获取一个新的 begin 迭代器,因为您总是要删除第一个元素。这将使您的 for 循环看起来像

for (START = l.begin(); START != l.end(); START = l.begin()) {
    m.push_back(countRepetition(START));
}

另一个问题是你只是检查字符是否不是0。如果要计算重复次数,则需要确保检查迭代器是否为同一字符。我会把它留给你去实现。


我还想指出,有一种更简单的方法可以完成所有这些操作。 std::map 让您可以非常轻松地构建直方图。将其与 std::max_element 相结合,您可以将整个程序编写为

int main()
{
    std::map<char, int> histogram;
    while ('0' != (number = getchar()))
        ++histogram[number]; // add to map, increment count of occurances

    auto most_frequent = *std::max_element(histogram.begin(), 
                                           histogram.end(), 
                                           [](const auto& lhs, const auto& rhs) { return lhs.second < rhs.second; }).first;
    std::cout << most_frequent;    
    return 0;
}

关于c++ - 在列表中查找最常见的元素(C++ STL)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49613269/

相关文章:

c++ - 静态函数链接器错误

c++ - 使用模板来提高代码的抽象层次?

Excel 根据选择的下拉选项更改单元格值

c++ - c++ std::vector 是如何工作的?

algorithm - 矢量点积计算的时间和空间复杂度

c++ - OpenCV:错误:不匹配调用 '(cv::Mat) (int&, int&)'

c++ - vector动态内存分配之private member vector

python - list() 函数在 Python 中有什么作用?

java - 列表元素之间的依赖关系

c++ - vector < boolean >访问