[英]C++ How to find position of last occurrence of element in vector
假設我有一個帶有數字的向量: 10 10 58 31 63 40 76
。 我想找到最小元素最后一次出現的位置。 最小元素是10
。 最后一次出現10
的位置是1
。
我試過使用反向迭代器,但我還是有點困惑。
假設向量:
std::vector<int> v = { 10, 10, 58, 31, 63, 40, 76 };
您可以使用反向迭代器和std::min_element
獲取最后一個最小元素:
auto last_min = std::min_element(std::rbegin(v), std::rend(v));
然后使用std::distance
和反向迭代器的“基數”獲取與向量開頭的距離:
auto last_min_distance = std::distance(std::begin(v), last_min.base());
最后減一得到索引:
auto last_min_index = last_min_distance - 1;
您使用反向迭代器的想法是正確的做法。 首先,您需要找到最后一個元素。 這可以通過std::min_element
和反向迭代器來完成:
auto min_elem_iter = std::min_element(std::crbegin(vec), std::crend(vec));
其中vec
是您要搜索的std::vector
。
現在您有了一個指向您搜索的最后一個元素的迭代器。 您需要檢查它是否與std::crend(vec)
相同,以確保它指向有效元素。
如果你想知道索引,你需要std::distance
,它可以用來計算兩個迭代器之間的距離。 有了它,您可以找出std::crbegin(vec)
和指向我們找到的元素的迭代器之間的距離。 這可以與向量的大小一起使用來計算索引。
所以總而言之,你可以得到你想要的:
template<class T>
auto getIndexOfLastMin(const std::vector<T>& vec)
-> std::optional<std::size_t>
{
auto last_elem_iter = std::min_element(std::crbegin(vec),
std::crend(vec));
if(last_elem_iter == std::crend(vec)){
return std::nullopt;
}
auto idx = std::distance(std::rbegin(vec), last_elem_iter);
return static_cast<std::size_t>(vec.size() -1 - idx);
}
您可以在此處簽出並運行代碼
假設最小元素是 k
for (int i = 0; i < vector.size(); i++)
{
if( k == vector[i])
{
index = i;
}
}
在循環結束時,索引將是向量中最小元素的最后一個位置。
...如果您沒有預先找到最小元素,您可以這樣做:
int min_element = std::numeric_limits <int>::max;
size_t index = 0;
for (size_t i = 0; i < vector.size(); i++)
{
if (vector[i] <= min_element)
{
min_element = vector[i];
index = i;
}
}
並非一切都必須復雜(這是現代 C++ 的主要缺陷:任何程序員都想成為天才)。 把事情簡單化:
#include <vector>
#include <limits.h>
int main()
{
std::vector<int> v = { 10, 10, 58, 31, 63, 40, 76 }; // This is the vector
int min = INT_MAX;
size_t i = 0, last_min_i = 0;
for (auto item : v) {
if (item <= min) {
min = item;
last_min_i = i;
}
i++;
}
// last_min_i holds the result
}
我假設您已經找到了最小元素。 然后一個簡單的向后循環似乎最簡單
size_t index = vec.size();
do
{
--index;
}
while (vec.at(index) != min_element);
如果碰巧你犯了一個錯誤,那么使用at
將導致異常,這比使用[]
得到的 UB 更安全。
你可以用反向迭代器做一些事情,但為什么復雜呢?
要找出向量中元素的最后一次出現,我們可以使用 find_end()。 它用於找出子序列的最后一次出現。
vector<int> v1 = {1,3,5,7,9};
vector<int> v2 = {7};
auto it = find_end(v1.begin(),v1.end(),v2,begin(),v2.end());
//printing the position of the element, use it-v1.begin();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.