How do I find an element position in std::vector?

前端 未结 10 1875
情深已故
情深已故 2021-01-31 08:40

I need to find an element position in an std::vector to use it for referencing an element in another vector:

int find( const vector& whe         


        
相关标签:
10条回答
  • 2021-01-31 08:44

    std::vector has random-access iterators. You can do pointer arithmetic with them. In particular, this my_vec.begin() + my_vec.size() == my_vec.end() always holds. So you could do

    const vector<type>::const_iterator pos = std::find_if( firstVector.begin()
                                                         , firstVector.end()
                                                         , some_predicate(parameter) );
    if( position != firstVector.end() ) {
        const vector<type>::size_type idx = pos-firstVector.begin();
        doAction( secondVector[idx] );
    }
    

    As an alternative, there's always std::numeric_limits<vector<type>::size_type>::max() to be used as an invalid value.

    0 讨论(0)
  • 2021-01-31 08:46

    You could use std::numeric_limits<size_t>::max() for elements that was not found. It is a valid value, but it is impossible to create container with such max index. If std::vector has size equal to std::numeric_limits<size_t>::max(), then maximum allowed index will be (std::numeric_limits<size_t>::max()-1), since elements counted from 0.

    0 讨论(0)
  • 2021-01-31 08:48

    In this case, it is safe to cast away the unsigned portion unless your vector can get REALLY big.

    I would pull out the where.size() to a local variable since it won't change during the call. Something like this:

    int find( const vector<type>& where, int searchParameter ){
        int size = static_cast<int>(where.size());
        for( int i = 0; i < size; i++ ) {
           if( conditionMet( where[i], searchParameter ) ) {
               return i;
           }
        }
        return -1;
    }
    
    0 讨论(0)
  • 2021-01-31 08:48

    Something like this, I think. find_if_counted.hpp:

    #ifndef FIND_IF_COUNTED_HPP
    #define FIND_IF_COUNTED_HPP
    
    #include <algorithm>
    
    namespace find_if_counted_impl
    {
        template <typename Func>
        struct func_counter
        {
            explicit func_counter(Func& func, unsigned &count) :
            _func(func),
            _count(count)
            {
            }
    
            template <typename T>
            bool operator()(const T& t)
            {
                ++_count;
    
                return _func(t);
            }
    
        private:
            Func& _func;
            unsigned& _count;
        };
    }
    
    // generic find_if_counted,
    // returns the index of the found element, otherwise returns find_if_not_found
    const size_t find_if_not_found = static_cast<size_t>(-1);
    
    template <typename InputIterator, typename Func>
    size_t find_if_counted(InputIterator start, InputIterator finish, Func func)
    {
        unsigned count = 0;
        find_if_counted_impl::func_counter<Func> f(func, count);
    
        InputIterator result = find_if(start, finish, f);
    
        if (result == finish)
        {
            return find_if_not_found;
        }
        else
        {
            return count - 1;
        }
    }
    
    #endif
    

    Example:

    #include "find_if_counted.hpp"
    #include <cstdlib>
    #include <iostream>
    #include <vector>
    
    typedef std::vector<int> container;
    
    int rand_number(void)
    {
        return rand()  % 20;
    }
    
    bool is_even(int i)
    {
        return i % 2 == 0;
    }
    
    int main(void)
    {
        container vec1(10);
        container vec2(10);
    
        std::generate(vec1.begin(), vec1.end(), rand_number);
        std::generate(vec2.begin(), vec2.end(), rand_number);
    
        unsigned index = find_if_counted(vec1.begin(), vec1.end(), is_even);
    
        if (index == find_if_not_found)
        {
            std::cout << "vec1 has no even numbers." << std::endl;
        }
        else
        {
            std::cout << "vec1 had an even number at index: " << index <<
                " vec2's corresponding number is: " << vec2[index] << std::endl;
        }
    }
    

    Though I feel like I'm doing something silly... :X Any corrections are welcome, of course.

    0 讨论(0)
  • 2021-01-31 08:48

    Take a vector of integer and a key (that we find in vector )....Now we are traversing the vector until found the key value or last index(otherwise).....If we found key then print the position , otherwise print "-1".

         #include <bits/stdc++.h>  
         using namespace std;  
    
         int main()  
          {  
              vector<int>str;  
              int flag,temp key, ,len,num;
    
               flag=0;
               cin>>len;
    
               for(int i=1; i<=len; i++)  
               {
                   cin>>key;
                   v.push_back(key);
               }
    
               cin>>num;
    
               for(int i=1; i<=len; i++)  
               {  
                 if(str[i]==num)  
                 {  
                    flag++;  
                    temp=i-1;
                    break;
                 }  
               }
    
             if(flag!=0)    cout<<temp<<endl;
             else           cout<<"-1"<<endl;   
             str.clear();   
    
             return 0;  
          }
    
    0 讨论(0)
  • 2021-01-31 08:50

    Take a look at the answers provided for this question: Invalid value for size_t?. Also you can use std::find_if with std::distance to get the index.

    std::vector<type>::iterator iter = std::find_if(vec.begin(), vec.end(), comparisonFunc);
    size_t index = std::distance(vec.begin(), iter);
    if(index == vec.size()) 
    {
        //invalid
    }
    
    0 讨论(0)
提交回复
热议问题