C++ 如何从具有(值>0)的向量中获取最小值

C++ 如何从具有(值>0)的向量中获取最小值,c++,vector,minimum,C++,Vector,Minimum,我试图将向量中不等于或小于0的所有元素减少一些值 我没有真正尝试过任何东西,因为我只是无法解决这个问题,但我需要,例如,从向量{1,2,3,0,-1}得到值向量[0] 我不想排序或删除任何值,我需要向量来保持它的结构 包括 包括 使用名称空间std; int main { 向量R; //很抱歉,我无法提供任何代码,我无法处理此问题 } 我期望例如:来自向量 A = {1, 2, 3, 4, 0, -1} B = {53, 36, 205, -8, -45, -93} 要获得: A[0] B[1

我试图将向量中不等于或小于0的所有元素减少一些值

我没有真正尝试过任何东西,因为我只是无法解决这个问题,但我需要,例如,从向量{1,2,3,0,-1}得到值向量[0] 我不想排序或删除任何值,我需要向量来保持它的结构

包括 包括 使用名称空间std; int main { 向量R; //很抱歉,我无法提供任何代码,我无法处理此问题 } 我期望例如:来自向量

A = {1, 2, 3, 4, 0, -1}
B = {53, 36, 205, -8, -45, -93}
要获得:

A[0]
B[1]

这些只是随机向量,可以做一些示例

您可以使用如下自定义累积:

#include <algorithm>
#include <iostream>
#include <vector>
#include <limits> //std::numeric_limits
#include <numeric> //std::accumulate
#include <iterator> //std::begin, std::end

int main()
{
    std::vector<int> R{1, 2, 3, 4, 0, -1};

    std::cout << std::accumulate(std::begin(R), std::end(R), std::numeric_limits<int>::max(), 
      [](int a, int b){if (b > 0) return std::min(a, b); return a;});
}

如果向量中没有严格的正元素,则返回整数的最大值。

您可以使用如下自定义累加:

#include <algorithm>
#include <iostream>
#include <vector>
#include <limits> //std::numeric_limits
#include <numeric> //std::accumulate
#include <iterator> //std::begin, std::end

int main()
{
    std::vector<int> R{1, 2, 3, 4, 0, -1};

    std::cout << std::accumulate(std::begin(R), std::end(R), std::numeric_limits<int>::max(), 
      [](int a, int b){if (b > 0) return std::min(a, b); return a;});
}

如果向量中没有严格的正元素,则返回整数的最大值。

这是一个非常未知的用例:

这将对输入向量的副本进行排序。对于简单的情况,这是您可以获得的最佳努力/性能

[std::lower_bound]返回一个迭代器,该迭代器指向范围[first,last]中的第一个元素,该范围不小于即大于或等于value,如果未找到此类元素,则返回last


这将扫描排序后的v,查找不小于1的第一个元素,并向其返回一个迭代器。请注意,如果v的任何元素都不为正,它将返回一个无效的迭代器。我将让您解决这个问题;

这是一个非常未知的用例:

这将对输入向量的副本进行排序

[std::lower_bound]返回一个迭代器,该迭代器指向范围[first,last]中的第一个元素,该范围不小于即大于或等于value,如果未找到此类元素,则返回last



这将扫描排序后的v,查找不小于1的第一个元素,并向其返回一个迭代器。请注意,如果v的任何元素都不为正,它将返回一个无效的迭代器。我会让您解决这个问题;

如果您可以先对向量排序,这个问题将更容易。如果只有一些std::sort或std::remove\u if函数。。。该死!你为什么要对它排序?或者创建两个指针,一个从向量的开头开始,另一个从向量的结尾开始。比较这两个值,对最小的一个进行排序,不为负,一直到向量的结尾,也就是向量的中心存储和比较每次发现最小的一个希望我很清楚…比对d然后检查向量,至少你的标题是清楚的。如果你还没有找到它,那么问问你自己如何在没有任何进一步限制的情况下找到最小值。只找到向量中的最小值。然后思考如何把额外的条件塞进那里。如果你能先对向量排序,这个问题会容易得多。如果有一些条件的话std::sort或std::remove_if functions…该死!为什么要对其进行排序?或者创建两个指针,一个从向量的开头开始,另一个从向量的结尾开始。比较这两个值,对最小的一个进行非负排序,一直到向量的结尾,也就是向量的中心存储和比较每次发现最小的一个很清楚…比排序更有效,然后浏览矢量。好吧,至少你的标题是清楚的。如果你还没有做到这一点,那么问问自己如何在没有任何进一步限制的情况下找到最小值。只找到矢量中的最小值。然后思考如何将额外的条件塞进其中。确实,谢谢!剪贴簿打开时禁止复制/粘贴ard包含工作中的include。疯狂愚蠢…我非常惊讶一行需要标准库中的4个include,所以我不得不建议编辑。5如果你计算iostream hahaFWIW std::begin和std::end,则不需要包含迭代器。所有容器都包括,,,,,,并保证包含它。规则拇指:如果你有一个包含容器,你可以免费获得开始和结束。的确,谢谢!当剪贴板包含工作中的包含时,禁止复制/粘贴。疯狂愚蠢…我太惊讶了,一行需要标准库中的4个包含,所以我不得不建议编辑。5如果你算上iostream hahaFWIW std::begin和std::end,不要需要包含迭代器。所有容器都包括、、、、和,并保证包含它。经验法则:如果包含容器,则可以免费获得“开始”和“结束”。@PlayLikeMe10YT在获得F-”之前,您是否阅读了最后两句话?请添加该内容我只是一个新手,但我不知道我需要它,是吗可能对其他人有帮助什么是F-?不,你看起来并不愚蠢,但你需要了解复杂性和代码的作用。你的老师也可能不同意你的观点,因为在现实生活中,你可能会经常遇到这样的情况,你的原始合同是X,但你最终也会处理Y,因为它实际上是
比这更复杂。@PlayLikeMe10YT•如果我看起来如此愚蠢,我很抱歉,我只是个新手。这东西很硬。用任何语言都很难。由于许多原因和历史原因,C++比许多其他语言都难。而C++的教学方式使它看起来更具压倒性和困惑。对于一种更友好、更温和、更易接近的C++教学方式,Q.V.PraseCyMe10YT你在读到F之前读过最后两个句子吗?请加上,我只是个新手,但我不知道我需要这个,这对其他人可能有帮助。F是什么?不,你看起来不傻。但您需要了解复杂性以及代码的作用。你的老师也可能不同意你的观点,因为在现实生活中,你可能会经常遇到这样的情况:你的原始合同是X,但你最终也处理了Y,因为它实际上比这更复杂。@PlayLikeMe10YT•如果我看起来如此愚蠢,我很抱歉,我只是个新手。这东西很硬。用任何语言都很难。由于许多原因和历史原因,C++比许多其他语言都难。而C++的教学方式使它看起来更具压倒性和困惑。另一种方法是用更友好、更温和、更易接近的方式教C++。
std::sort(begin(v), end(v));
std::lower_bound(begin(v), end(v), 1);