我正在尝试编写一个简单的程序,从标准输入读取double
类型的值,将其打印在屏幕上并检查它是否是所有先前加载的值的最低值或最大值。
我的代码如下所示:
#include "../std_lib_facilities.h"
int main()
{
int i=0;
double number;
vector<double> temps;
double minimum;
double maximum;
while(cin>>number)
{
sort(temps.begin(),temps.end());
temps.push_back(number);
cout << number;
if(number>temps[temps.end()])
{
maximum=numer;
}
else if (liczba<(temps[temps.begin()]))
{
minimum=number;
}
}
return 0;
}
我收到以下错误:
'operator []'不匹配(操作数类型是'Vector&lt; double&gt;'和'std :: vector&lt; double&gt; :: iterator {aka __gnu_cxx :: __ normal_iterator&lt; double *,std :: vector&lt; double&gt; &GT;}')
包含if
语句的行,用于检查当前number
是否大于或低于到目前为止已输入的已排序数组的极值。
这个问题的解决方案是什么?我认为它与语法有关,但我的想法已经用完了。
答案 0 :(得分:4)
operator[]
采用索引,而不是迭代器。
如果要使用迭代器(例如,因为您将迭代器作为某些算法的一部分),您可以通过取消引用迭代器来访问第一个和最后一个元素:
auto first_element = *(vector.begin());
auto last_element = *(vector.end() - 1);
auto last_element_2 = *(vector.rbegin());
operator[]
数组访问运算符采用索引,如下所示:
auto first_element = vector[0];
auto last_element = vector[vector.size() - 1];
您也可以使用vector.at(index)
代替vector[index]
。这会增加额外的边界检查(如果索引超出范围,您将获得异常),但具有运行时性能成本
vector
自己的功能 std::vector
已经内置了函数来访问第一个和最后一个元素。
auto first_element = vector.front();
auto last_element = vector.back();
答案 1 :(得分:2)
ionic cordova plugin add cordova-android-play-services-gradle-release
是一个迭代器,而不是索引。 temps.end()
期望一个索引,因为你给它一个迭代器,它会导致编译器错误。如果要获取向量中的第一个和最后一个元素,则可以使用分别返回第一个和最后一个元素的std::vector::operator[]
和front
成员函数。看起来像是
back
答案 2 :(得分:0)
向量的operator[]
采用数字索引,不是迭代器。向量的begin()
和end()
返回迭代器。在if
语句中,您将迭代器传递给下标运算符而不是数字,从而导致错误。
如果您想要向量的第一个和最后一个元素,请使用front()
和back()
,或取消引用迭代器。
if(number > temps.back())
{
maximum=numer;
}
else if (liczba < temps.front())
{
minimum=number;
}
///OR.........
if(number > *(temps.end() - 1))//Remember that end() is one-past-the-end iterator
{
maximum=numer;
}
else if (liczba < *temps.begin())
{
minimum=number;
}