我想知道一种正确而优雅的方式来标记不属于矢量/数组的索引。让我向您展示一个简短的例子,展示我的意思(使用一些伪代码短语):
std::vector<**type**> vector;
int getIndex()
{
if (**user has selected something**)
{
return **index of the thing in our vector**;
} else
return -1;
}
int main()
{
int selectedItem = getIndex();
if (selectedItem<vector.size()) //checking if selected index is valid, -1 is not
{
**do something using selected object**
}
}
当然我的意思是以更复杂的方式使用它,但我希望问题显示在示例中。使用-1个常量标记不在向量中的索引是一个好主意吗?它会导致有关比较有符号值和无符号值的警告,但仍然可以按照我的要求进行操作。
如果我的 selectedItem 变量为-1,我不想再检查另外一个,这会产生一个额外的,不必要的条件。那么这是一个很好的解决方案,还是我应该考虑别的什么?
答案 0 :(得分:4)
表明在vector
中找不到您正在寻找的内容的最优雅方式是按照预期的方式使用C ++标准库设施 - {{1 }} S:
iterator
答案 1 :(得分:1)
最好使用迭代器,但如果你决定坚持使用索引,那么最好让getIndex
返回size_t
,而string::find()
会这样做:
size_t getIndex()
{
//...
return -1; // the same as std::numeric_limits<size_t>::max()
}
这种方式getIndex(element) < vec.size()
当且仅当元素存在于向量中时。
答案 2 :(得分:0)
struct SelectableItem {bool selected;/*more suff here*/};
struct IsSelected(const SelectableItem& sel) {return sel.selected;}
int main(int argc, char** argv)
{
std::vector<SelectableItem> vec;
//populate vector
auto found = vec.find_if(vec.begin(), vec.end(), IsSelected());
if (found != vec.end())
{
SelectedItem& selected_item = *found;
/*do something*/
}
}
不要重新发明轮子。
答案 3 :(得分:0)
如果你坚持使用整数索引而不是迭代器,那么-1是用来表示&#34; not found&#34;的通常的sentinel值。但是,与vec.size()
进行比较,您应该与0
进行比较,以避免签名/无符号不匹配。
答案 4 :(得分:0)
如果您决定使用vec.end(),那么您可以通过在调试模式下使用-D_GLIBCXX_DEBUG进行编译来防止无效的迭代器(例如,在创建迭代器后在向量中插入元素)。
我会使用-1,但是到处都使用size_t类型。迭代器非常容易出错,并且在细节方面,ISO标准是模糊的和分散的。