【问题标题】:Why would you ever want to use 'int index = min_element(vector.begin(), vector.end()) - vector.begin();' (c++) [duplicate]你为什么要使用'int index = min_element(vector.begin(), vector.end()) - vector.begin();' (c++) [重复]
【发布时间】:2021-03-26 21:05:21
【问题描述】:

我发现了一些我想理解的 c++ 代码。在这段代码中,他们使用

int airplane = min_element(min_cost_airplane.begin(),
min_cost_airplane.end()) - min_cost_airplane.begin();

但我不知道这行代码究竟完成了什么。 min_cost_airplane 是一个向量。我了解 min_element 函数,但我无法在结尾处环绕 -vector.begin 。这行代码的结构是常用的吗?我理解的是,这行代码返回一个指向向量中最小元素的迭代器减去指向向量第一个元素的迭代器。那么迭代器指向什么? 有人可以帮帮我吗?

【问题讨论】:

标签: c++


【解决方案1】:

std::min_element 算法返回一个迭代器。您可以取消引用该迭代器以访问容器的“最小”元素。相反,如果您想知道元素的 index,则需要将其计算为与容器开头的距离。

对于随机访问迭代器,您可以减去迭代器以获得偏移量或索引值。这就是你的例子所做的。还有一个std::distance 函数可以计算索引,但它也适用于非随机访问迭代器。例如:

auto iter = std::min_element(min_cost_airplane.begin(), min_cost_airplane.end());
int index = std::distance(min_cost_airplane.begin(), iter);

【讨论】:

    【解决方案2】:

    std::min_element 返回一个迭代器到给定范围内最小值的第一个实例。

    begin 向容器中的第一个元素返回一个迭代器

    std::vector 迭代器很特别(它是一个随机访问迭代器),因为您可以将一个迭代器从另一个迭代器中减去,从而产生它们之间的元素距离(它是引擎盖下的指针算术) .为了更通用和更清晰,请写

    auto airplane = std::distance(
        min_cost_airplane.begin(),
        std::min_element(min_cost_airplane.begin(), min_cost_airplane.end())
    );
    

    【讨论】:

    • 挑剔:不是std::vectors 迭代器是特殊的,但所有随机访问迭代器都支持-
    • @largest_prime_is_463035818:是的,值得添加。
    【解决方案3】:

    std::min_element 用于查找范围 [first, last] 中的最小元素。

    std::vector<int> v{3, 8, 4, 2, 5, 9};
     
    std::vector<int>::iterator result = std::min_element(v.begin(), v.end());
     //result iterator to the minimum value in vector v.
    std::cout << "min element is: " << *result;
    

    输出:最小元素为:2

    注意:向量 v 中的最小值是 2。

    【讨论】:

    • 这不是答案,因为问题中行的结果是偏移的,不是最小元素。
    • OPs 代码找到的是 min 元素的索引,而不是值
    • 这不能回答问题。也许你可以解释一下你从result 中减去begin() 得到的结果。
    • 解释代码实际所做的事情可能会令人困惑;)
    • OP 在问题I understand the min_element function 中写道,但不是函数旁边的内容。所以,你的回答只解释了 OP 已经知道的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 2015-11-17
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多