如何在向量中获取最小元素的索引?

6

我想知道向量中哪个元素是最小的,但min_element返回一个指向该元素的迭代器。因此,我尝试了以下方法:

vector<int> vec = {4,5,0,1,2,3} ;
int min_element_index = min_element(vec.begin(), vec.end()) - vec.begin();

然而,我不确定这种方法总是有效的。我不知道向量是如何在内存中存储的,而且我担心当我使用push_back时会出现问题。

1
我不确定它是否总是有效。向量元素是否连续存储? - M12421K
1
向量元素在内存中连续存储。但是,除非您使用vector::data,否则您不需要关心这一点,而大多数情况下您也不应该这样做。 - Jabberwocky
2个回答

20

你也可以这样做:

std::vector<int>::iterator it = std::min_element(std::begin(vec), std::end(vec));
std::cout << "index of smallest element: " << std::distance(std::begin(vec), it);

或者更简单一些:

auto it = std::min_element(std::begin(vec), std::end(vec));
std::cout << "index of smallest element: " << std::distance(std::begin(vec), it);
或者:
std::cout << "index of smallest element: " <<
std::distance(std::begin(v), std::min_element(std::begin(v), std::end(v)))

4
我最喜欢这个答案,因为它更通用,也适用于非随机访问容器。 - NathanOliver

3

向量成员保证被存储在连续的内存中,但这并不重要。

向量迭代器是随机访问迭代器,因此减去向量迭代器是可定义的(这将总是适用于符合标准的std::vector)。

要将向量迭代器转换为指针,可以执行&*(vector-iterator),但这里没有必要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接