【问题标题】:My program keeps throwing compilation error,I am not able to figure out why the error has occured我的程序不断抛出编译错误,我无法弄清楚为什么会发生错误
【发布时间】:2019-07-27 07:33:51
【问题描述】:

似乎无法弄清楚程序不断抛出的错误。当我取消引用迭代器时,程序不断抛出错误。谁能告诉我哪里出错了? 代码的问题是这样的“给定五个正整数,找到可以通过将五个整数中的四个精确相加来计算的最小值和最大值。然后将各自的最小值和最大值打印为一行,由两个空格分隔长整数。”

void miniMaxSum(vector<int> arr) {   //arr = {1,2,3,4,5}
    int sum = 0;
    unordered_map<int,int> results;
    for(size_t i = 0;i < arr.size();i++)
    {
        results[arr[i]] = accumulate(arr.begin(),arr.end(),sum) - arr[i];
    }
    pair<unordered_map<int,int>::iterator,unordered_map<int,int>::iterator> mn;
    mn = minmax_element(results.begin(),results.end());
    cout<< *mn.first<<" "<<*mn.second; //line where the error is occuring
}

Solution.cpp:在函数“void miniMaxSum(std::vector)”中: Solution.cpp:9:9: error: no match for 'operator

【问题讨论】:

  • 想想您要打印的内容以及您是否以正确的方式进行打印。错误很清楚你错在哪里。
  • 我尝试使用 ->,尽管它一直显示相同的错误。
  • 旁注,auto 是你的朋友。这段代码更好auto mn = minmax_element(results.begin(), results.end());
  • @Afrahmohd 你到底想打印什么?请记住,您有一对迭代器,每个迭代器都指向另一对。
  • @Afrahmohd 错误是使用unordered_map,请参阅下面的答案。

标签: c++ stl


【解决方案1】:

编辑:我的回答修复了编译问题,但 OP 函数并没有按照他们的意愿执行。约翰的回答解决了真正的算法问题。

我重新设计了您的 sn-p 以使其立即可编译:

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <unordered_map>

using namespace std;

void miniMaxSum(vector<int> arr) {   //arr = {1,2,3,4,5}
    int sum = 0;
    unordered_map<int,int> results;
    for(size_t i = 0;i < arr.size();i++)
    {
        results[arr[i]] = accumulate(arr.begin(),arr.end(),sum) - arr[i];
    }
    pair<unordered_map<int,int>::iterator,unordered_map<int,int>::iterator> mn;
    mn = minmax_element(results.begin(),results.end());
    auto minIt = mn.first;
    auto maxIt = mn.second;
    cout<< "key min elem: " << minIt->first << " value min elem: " << minIt->second; 
    cout<< "key max elem: " << maxIt->first << " value max elem: " << maxIt->second;
}

问题在于mn 的类型:pair&lt;unordered_map&lt;int,int&gt;::iterator,unordered_map&lt;int,int&gt;::iterator&gt;mnpair。使用mn.first,您可以获得键值对的迭代器(错误指的是pair)。拥有pair 后,您需要直接访问您感兴趣的元素。我在示例中明确说明了该段落。您可以查看此处(底部示例):https://en.cppreference.com/w/cpp/container/unordered_map 上的迭代器结构 unordered_map

PS:你可能想避免using namespace std 我这样做是为了将你和我的 sn-p 之间的差异保持在最低限度。

【讨论】:

  • 是的,对不起,我改行了。实际上是 arr[i] 而不是 arr[0]
【解决方案2】:

所以这是解决问题的方法

void miniMaxSum(vector<int> arr) {   //arr = {1,2,3,4,5}
    vector<int> results(arr.size());
    for (size_t i = 0; i < arr.size();i++)
    {
        results[i] = accumulate(arr.begin(), arr.end(), 0) - arr[i];
    }
    auto mn = minmax_element(results.begin(), results.end());
    cout << *(mn.first) << " " << *(mn.second);
}

基本错误是您选择了unordered_map&lt;int,int&gt; 而不是vector&lt;int&gt; 来存储中间结果。

请注意,正确的语法是 *(mn.first)*(mn.second),因为您有一对迭代器,而不是指向一对的迭代器。

Working example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-11
    • 2018-12-03
    • 2020-02-16
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多