如何将值转换为迭代器

问题描述:

我认为矢量中的擦除函数需要迭代器。但我有一个情况我有传递给它的矢量值,所以我怎么把它们转换成一个iterator如何将值转换为迭代器

vec.erase(max(*vec.begin(),*vec.end())); 
+4

该代码从开始就完全错误,因为您正在解引用'end()'。也就是说,这当然似乎是[XY问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你应该使用['std :: max_element'](http://en.cppreference.com/w/cpp/algorithm/max_element)'(vec.begin(),vec.end())'返回的迭代器,只有当矢量不是空的时候。 – WhozCraig

+0

它的工作表示感谢! – paul221

你不知道。

你的目标出现是要删除向量中的最大值。如果是这样,并且假定值类型可以使用operator <进行比较,则可以使用std::vector::erase以及std::max_element返回的迭代器的组合。

#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <random> 

int main() 
{ 

    // fill a vector of 1..30 
    std::vector<int> vec(30); 
    std::iota(vec.begin(), vec.end(), 1); 

    // shuffle 
    std::mt19937 rng{ std::random_device{}() }; 
    std::shuffle(vec.begin(), vec.end(), rng); 

    // report values 
    for (auto x : vec) 
     std::cout << x << ' '; 
    std::cout.put('\n'); 

    // erase an instance of the largest element 
    vec.erase(std::max_element(vec.begin(), vec.end())); 

    // report values 
    for (auto x : vec) 
     std::cout << x << ' '; 
    std::cout.put('\n'); 
} 

样本输出

10 4 22 16 15 25 1 28 2 29 13 5 27 14 3 17 19 23 21 11 26 20 8 30 24 6 12 18 9 7 
10 4 22 16 15 25 1 28 2 29 13 5 27 14 3 17 19 23 21 11 26 20 8 24 6 12 18 9 7 

注意,30从第二序列缺失。