【问题标题】:int function that returns an index from a vector of bools从布尔向量返回索引的 int 函数
【发布时间】:2015-01-27 17:44:23
【问题描述】:

我有以下功能:

int FamiliesController::returnFamilySelected(){

for ( int i = 0; i < isFamilyCoosenController.size(); i++){

    if ( isFamilyChosenController[i] == true){

            return i;
        }   
    }
}

这个函数返回一组布尔值的索引,当其中一个为真时,它返回它在向量中的索引,非常简单。我现在遇到的问题是,当所有布尔值都是错误的时候。该函数返回一个奇怪的数字 -1029384。如果我像这样比较它们的那一刻:

int FamiliesController::returnFamilySelected(){

for ( int i = 0; i < isFamilyChosenController.size(); i++){

    if ( isFamilyChosenController[i] == true){

            return i;
        }else if ( is FamilyIsChosenController[i] == false){
            return - 1;
     }   
    }
}

它总是返回-1。因为只有一个元素为真并不重要,一旦它在向量中传递该布尔值,它将立即返回假,因为下一个元素为假。我需要始终返回已变为真的索引。

有没有办法告诉它例如(伪代码):

for ( int i = 0; i < isFamilyChosenController.size(); i++){// we check in our vector of booleans

   if ( One boolean == true ){

       return the index of that boolean;

   }else if ( all the booleans == false ){

     return -1; // a number that is out of the container size but I can manipualte


}

请注意,我没有使用 c++ 11。

谢谢!

【问题讨论】:

    标签: c++ for-loop vector


    【解决方案1】:

    只需将return -1 放在循环之后。任一值满足您的条件并返回其索引,否则循环结束并返回 -1。

    也就是说,在 C++ 中执行此操作的惯用方法是使用 std::find

    【讨论】:

    • 非常感谢!我应该看到的。但是 std::find 只会告诉我布尔值何时变为真或它们全部为假,因为它使用迭代器而不是索引。如何使用 std::find 捕获布尔值的索引号?
    • 此外,如果您的程序到达非void 函数的末尾(这就是您得到那个奇怪数字的原因),这是未定义的行为。
    • @mauricioSanchez:std::find 将迭代器返回到匹配的项目。然后您可以return std::distance(isFamily.begin(), return_value) 将其转换为索引。在这种情况下,实际上迭代器将是一个指针,std::distance 将执行指针减法,但请注意,这并不能保证(并且并非对所有类型的容器都是如此)。
    • @Jon 谢谢!这非常有用!
    【解决方案2】:

    你的问题是,如果你没有找到匹配项,你不会返回任何东西

    一个好的编译器至少会警告你

    int FamiliesController::returnFamilySelected(){
    
    for ( int i = 0; i < isFamilyCoosenController.size(); i++){
    
        if ( isFamilyChosenController[i] == true){
    
                return i;
            }   
        }
    }
    // now what?????
    

    您需要返回一个标记值来表示“未找到”

    int FamiliesController::returnFamilySelected(){
    
    for ( int i = 0; i < isFamilyCoosenController.size(); i++){
    
        if ( isFamilyChosenController[i] == true){
    
                return i;
            }   
        }
    }
    return -1; // not found
    

    或者你可以扔

    【讨论】:

      【解决方案3】:

      好吧,只有当向量的第一个元素为真时,您的代码才会按预期工作。相反,你可以试试这个:

      int FamiliesController::returnFamilySelected(){
      
      int index = -1;
      
          for ( int i = 0; i < isFamilyChosenController.size(); i++){
      
              if ( isFamilyChosenController[i] == true){
      
                  index = i;
                  break;
              }
          }
          return index;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 2020-02-26
        • 2017-06-07
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 2020-06-30
        相关资源
        最近更新 更多