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但是你的比较函数需要2个整数。您可能希望更改存储在向量中的类型或更改所使用的比较函数。如果使用整数,则默认比较运算符将执行您想要的操作,而无需编写自定义函数
还需要一个用于开始,一个用于结束的迭代器,因此需要将调用更改为类似于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';