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)
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开始计数.
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()
被用作无效值.