C ++优雅的方式来标记不属于矢量的索引

时间:2014-11-18 15:20:23

标签: c++ vector unsigned

我想知道一种正确而优雅的方式来标记不属于矢量/数组的索引。让我向您展示一个简短的例子,展示我的意思(使用一些伪代码短语):

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,我不想再检查另外一个,这会产生一个额外的,不必要的条件。那么这是一个很好的解决方案,还是我应该考虑别的什么?

5 个答案:

答案 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标准是模糊的和分散的。