簡體   English   中英

C ++如何找到向量中元素最后一次出現的位置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM