2017-08-02 3 views
-1

ベクトルのイレース関数はイテレータをとると思います。しかし、私はそれに渡さベクトル値を持っている状況があるので、どのように私はあなたがいないイテレータ値をイテレータに変換するには

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

答えて

1

に変換します。

あなたの目標は、ベクトルの最大値を削除することが表示されます。その場合、値の型がoperator <を使用して比較可能であると仮定すると、std::max_elementが返されるイテレータと共にstd::vector::eraseの組み合わせを使用します。

#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が第二の配列から欠落していることに留意されたいです。

関連する問題