如何在std :: vector中找到元素位置?

sha*_*oth 35 c++ search stl vector

我需要在std :: vector中找到一个元素位置,用它来引用另一个向量中的元素:

int find( const vector<type>& where, int searchParameter )
{
    for( int i = 0; i < where.size(); i++ ) {
       if( conditionMet( where[i], searchParameter ) ) {
           return i;
       }
    }
    return -1;
}
// caller:
const int position = find( firstVector, parameter );
if( position != -1 ) {
    doAction( secondVector[position] );
}
Run Code Online (Sandbox Code Playgroud)

但是vector::size()返回size_t对应于unsigned不能直接存储的整数类型-1.当使用size_t而不是int作为索引时,如何表示在向量中找不到元素?

Nav*_*een 60

看看为这个问题提供的答案:size_t的值无效?.你也可以使用std :: find_if和std :: distance来获取索引.

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
}
Run Code Online (Sandbox Code Playgroud)

  • 或者您可以针对`where.end()`检查迭代器,并且仅在不相等时计算/使用距离.不影响性能,只需在查找调用后立即保持成功检查. (7认同)

lar*_*moa 17

首先,你真的需要存储这样的指数吗?您是否查看了std :: map,使您能够存储key => value对?

其次,如果您使用迭代器,则可以返回std :: vector.end()来指示无效结果.要将迭代器转换为您只需使用的索引

size_t i = it - myvector.begin();
Run Code Online (Sandbox Code Playgroud)


Kir*_*sky 16

您可以使用std::numeric_limits<size_t>::max()未找到的元素.它是一个有效值,但不可能创建具有此类最大索引的容器.如果std::vector大小等于std::numeric_limits<size_t>::max(),那么最大允许索引将是(std::numeric_limits<size_t>::max()-1),因为元素从0开始计数.


sbi*_*sbi 6

std::vector具有随机访问迭代器.你可以用它们做指针运算.特别是,这my_vec.begin() + my_vec.size() == my_vec.end()总是成立.所以你可以做到

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] );
}
Run Code Online (Sandbox Code Playgroud)

作为替代方案,总是std::numeric_limits<vector<type>::size_type>::max()被用作无效值.