C++ 如何从向量<;标准::字符串>;

C++ 如何从向量<;标准::字符串>;,c++,c++11,vector,max,C++,C++11,Vector,Max,使用中的代码,我试图在向量中找到max int值。 向量是std::string格式,这里没有选择 bool myfn(int i, int j) { return i < j; } vector<std::string> dat; dat.push_back(2.1); dat.push_back(5.3); for (int l = 0; l < dat.size(); ++l) { std::cout << *std::max_ele

使用中的代码,我试图在
向量中找到max int值。
向量是std::string格式,这里没有选择

bool myfn(int i, int j)
{
    return i < j;
}

vector<std::string> dat;
dat.push_back(2.1);
dat.push_back(5.3);

for (int l = 0; l < dat.size(); ++l)
{
    std::cout << *std::max_element(dat.begin(), dat.end(), myfn) << '\n';
}
错误:

.cpp:76:93: error: no matching function for call to 'max_element(std::vector<std::basic_string<char> >&, std::vector<std::basic_string<char> >::size_type, bool (&)(int, int))'
.cpp:76:93:错误:调用“max_元素(std::vector&,std::vector::size_类型,bool(&)(int,int))时没有匹配的函数”

如何在
向量中找到最大值?

使用错误的参数调用
max\u元素。它需要两个迭代器和一个函数:

template <class ForwardIterator, class Compare>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last,
                           Compare comp);
在这种情况下,
myints
myints+7
都属于
int*
类型,原始指针是迭代器。然而,在您的例子中,您传递的是两种不同的类型(
vector
size\u t
),它们都不是迭代器。因此,您需要改为:

*std::max_element(dat.begin(), dat.end(), myfn)
或者,为了说明与参考文献中的示例等效的内容(尽管肯定更喜欢上述内容):

这是因为在本例中,我传递了两个
字符串*
,它们是迭代器


(同样根据您的用法,
dat
应该是
vector
而不是
vector

您有一个充满字符串的向量
vector dat

还需要一个用于开始,一个用于结束的迭代器,因此需要将调用更改为类似于
std::max_元素(dat.begin(),dat.end(),myfn)
。您可能会注意到,实际上不需要您拥有的循环,因为您已经通过调用
std::max_元素超过了该范围,该循环所做的只是多次计算完全相同的值,您只需要计算一次。

您的std::vector dat声明错误,因为您想要将_向后推int。 std::max_元素和std::min_元素返回一个迭代器not值。您可以查看以下示例

#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
    std::vector<int> v {1,2,3,4,6};
    auto biggest = std::max_element(std::begin(v), std::end(v));
    std::cout << "Max element is " << *biggest
       << " at position " << std::distance(std::begin(v), biggest) << std::endl;

    auto smallest = std::min_element(std::begin(v), std::end(v));
    std::cout << "min element is " << *smallest
        << " at position " << std::distance(std::begin(v), smallest) << std::endl;

    return 0;
}
#包括
#包括
#包括
int main()
{
std::向量v{1,2,3,4,6};
自动最大=标准::最大元素(标准::开始(v),标准::结束(v));

std::cout指针可以是迭代器。这就是允许您在标准库函数中将数组用作范围的原因。
myints
是一个表达式,它引用数组的第一个元素,
myints+7
引用数组末尾的元素。等效地,您可以执行
std::begin(myints)
std::end(myints)
。标准容器以这些成员函数的形式公开迭代器
myvector.begin()
myvector.end()
。您将这些迭代器传递到
std::max_元素,而不是容器和大小


默认情况下,
std::max_element
使用
运算符
myfn
是完全不必要的。默认值是做的少于。你的循环是无用的。
max_element
将覆盖整个范围。添加模板并进行更改。开始和结束,现在它会在@nerd007抛出此错误。你的
myfn
函数仍然需要两个时间当向量的元素类型为
std::string
时,整数作为参数。如果将参数类型更改为
std::string
,则错误将消失,但默认比较
max\u element
使用的是
问题是std::string max\u元素,因为向量是std::string(此处没有选择)当我试着把它转换成std::double时,我掉了一个数字,所以我的数学就错了。你的代码不起作用,因为它是int,而不是std::string vector.:(@nerd007你必须选择一个类型。你声明
vector dat
,但随后
dat.push_back(1)
1
不是一个
字符串
。您的比较器函数
myfn
,需要两个
int
s,而不是两个
string
s。所有内容都必须是相同的类型。数据作为字符串来自www。这些字符串填充一个std::string向量。一旦它们存在,我需要最大值(顶部选择)。是的,这里需要转换。www不会向我抛出双精度。在数据类型上没有选择,我必须使用我得到的数据。如何插入长十进制(双精度)将字符串格式转换为双向量?@nerd007您可能希望使用类似std::stod@nerd007的东西,而且这开始感觉可能是XY问题,您将使用什么样的示例输入?请提供一个逐字的示例,这会有所帮助。我有一个填充字符串的向量(没有选择)不是double。我需要知道max元素的double值。这里需要进行转换。我得到一个异常,可能是因为你的向量是int,我的是string。有没有简单的函数可以转换为double(这些是长小数)正在运行?如果要使用double,需要将数据类型更改为double。这很简单,如std::vector v{1.0,2.0,3.0,4.0,6.0};数据以字符串形式出现(没有选择)。我需要返回一个双精度值。如何对向量执行此操作?我有无穷多的数据。数据是std::string格式。不是int。最终它将需要双精度格式。但我得到std::string。数据是std::string格式。不是int。那么,您不应该提供一个接受int的比较函数,应该吗?您需要一个comp接受字符串的arison函数。
*std::max_element(dat.begin(), dat.end(), myfn)
std::string* first = &dat[0];
*std::max_element(first, first + dat.size(), myfn)
#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
    std::vector<int> v {1,2,3,4,6};
    auto biggest = std::max_element(std::begin(v), std::end(v));
    std::cout << "Max element is " << *biggest
       << " at position " << std::distance(std::begin(v), biggest) << std::endl;

    auto smallest = std::min_element(std::begin(v), std::end(v));
    std::cout << "min element is " << *smallest
        << " at position " << std::distance(std::begin(v), smallest) << std::endl;

    return 0;
}
std::vector<int> dat; 
dat.push_back(1); 
dat.push_back(3);

std::cout << *std::max_element(dat.begin(), dat.end()) << '\n';