17

我试图使用 STL 查找算法(和 min_element 算法)来定位向量中最小值的位置,但不是返回位置,它只是给了我值。例如,如果是最小值,则位置将返回为 8 等。我在这里做错了什么?

int value = *min_element(v2.begin(), v2.end());
cout << "min value at position " << *find(v2.begin(), v2.end(), value);
4

3 回答 3

34

min_element已经为您提供了迭代器,无需调用find(此外,它效率低下,因为它是工作的两倍)。使用distance-运算符:

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();
于 2008-10-08T14:09:42.480 回答
15

您使用的两种算法都返回迭代器。如果你取消引用一个迭代器,你会得到这个迭代器“指向”的对象,这就是为什么你在做的时候打印而不是位置

cout << "min value at position " << *find(v2.begin(), v2.end(), value);

迭代器可以看作是一个指针(嗯,不完全是,但为了简单起见,我们这样说);因此,单独的迭代器无法为您提供容器中的位置。由于您正在迭代向量,因此您可以使用减号运算符,正如 Konrad 所说:

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();

但我建议使用 std::distance 算法,它更加灵活,适用于所有标准容器:

cout << "min value at " << distance(v2.begin(), min_element(v2.begin(), v2.end()));
于 2008-10-08T14:23:49.737 回答
7

您认为您所问的问题的简短答案是“我如何确定std::vector<>给定迭代器的位置?” 是函数std::distance

但是,您可能打算做的是获取迭代器的值,您可以通过取消引用它来获得它:

using namespace std;
vector<int>::const_iterator it = min_element(v2.begin(), v2.end());
cout << "min value at position " << distance(v2.begin(), it) << " is " << *it;
于 2008-10-09T05:55:50.820 回答