为啥 min_element() 返回最小元素的索引,而不是迭代器?

Posted

技术标签:

【中文标题】为啥 min_element() 返回最小元素的索引,而不是迭代器?【英文标题】:Why is min_element() returning the index of the minimum element, instead of an iterator?为什么 min_element() 返回最小元素的索引,而不是迭代器? 【发布时间】:2019-12-31 15:06:39 【问题描述】:

min_element() 应该返回一个指向数组或向量中最小元素的指针,但这里它返回的是具有最小值的元素的位置。为什么会这样? 抱歉这个愚蠢的问题,我是初学者。

int n; cin>>n;
vector<int> arr(n);
for(int i=0;i<n;i++)
    cin>>arr[i];

int minElementIndex = min_element(arr.begin(),arr.end()) - arr.begin();
cout<<minElementIndex;

【问题讨论】:

为什么它返回元素的位置最小值 -- 它没有这样做。更仔细地看线。除了打电话给std::min_element,还有更多事情要做 你认为从min_element() 给出的迭代器中减去arr.begin() 会怎样? 只是想说,这个问题不应该被否决——虽然它一个简单的错误,但问题的形成得体并且具有最低限度的可重现代码sn- p. 【参考方案1】:

min_element 返回一个指向元素的迭代器(不一定是指针)。这里也是如此。

但是您没有打印min_element 调用的返回值。您首先要从中减去 arr 开头的迭代器 (- arr.begin())。

减去(随机访问)容器的迭代器(或指向同一数组的指针)会产生一个整数,其值等于迭代器或指针之间的距离。所以如果你在开头减去一个迭代器,你会得到元素的索引为整数。

【讨论】:

【参考方案2】:

在对min_element 的调用中,您正在从另一个指针中减去一个指针。不如试试这种方法:

    int index;
    int n; cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; i++)
        cin >> arr[i];

    int minElementValue = *std::min_element(arr.begin(), arr.end());


    for (int i = 0; i < n; i++) 
        if (arr[i] == minElementValue) 
            index = i;


        
    

    cout << minElementValue << ":" ;
    cout << "  " << index;


【讨论】:

以上是关于为啥 min_element() 返回最小元素的索引,而不是迭代器?的主要内容,如果未能解决你的问题,请参考以下文章

列表上的 std::min_element 不返回最小值

C++max_element()min_element()函数简介

max_element和min_element的用法

旋转数组的最小数字

C++11的新增函数和nullptr

C++11的新增函数和nullptr