【问题标题】:how to return an index from a function?如何从函数返回索引?
【发布时间】:2019-08-15 01:24:21
【问题描述】:

我正在开发一个电话簿程序。我需要使用 findContact 函数返回的位置并将其用作 deleteContact 函数中的索引。

void AddressBook::deleteContact(std::string nameMatch) //need to implement find contact && not found if there is a space at end of name
{

    if (length == 0)
    {
        std::cout << "Phonebook is empty" << std::endl;
        return;
    }



    findContact(nameMatch);
    std::cout << phoneBook[position]->name << " deleted" << std::endl;
    phoneBook[position] = phoneBook[length - 1]; //how to use position
    length--;

    return;
}

我使用二分搜索,因为它是由我的教授指导的。

int AddressBook::findContact(std::string nameMatch)
{
    int first = 0;
    int last = length - 1;
    int middle;
    int position = -1;
    bool found = false;

    while (!found && first <= last)
    {
            middle = (first + last) / 2;


            if (phoneBook[middle]->name == nameMatch)
            {
                found = true;
                position = middle;
            }

            else if (phoneBook[middle]->name > nameMatch)
            {
                last = middle - 1;
            }
            else
            {
                first = middle + 1;
            }
        }

        return position;
    }

它大多不完整,但我正在尝试弄清楚如何使用 position

从我的 findContact 函数返回并在我的 deleteContact 中使用它。

【问题讨论】:

    标签: c++ function return


    【解决方案1】:

    将返回值保存在局部变量中。

    auto position = findContact(nameMatch);
    

    【讨论】:

      【解决方案2】:

      我不太清楚你所说的如何使用位置是什么意思。如果您的问题是,从技术上如何将 position 从 find 方法转换为 delete 方法,@DeviationN 的答案就是您的解决方案。

      但您可能会问 如何 在您的 电话簿 容器中进行删除(它可能是一个向量?)。您所做的是覆盖您的条目以被电话簿中的最后一个条目删除。但是,这会违反排序顺序(在大多数情况下)。但是如果你使用二分查找,那么你的电话簿被排序是必要条件。

      相反,通过

      删除您在位置的条目
      phoneBook.erase( phonebook.cbegin() + position );
      

      end 要么像你一样减少你的长度,要么像重置它一样

      length = phoneBook.size();
      

      (这里我假设 phoneBook 是 std::vector 或 std::deque)

      编辑:我刚刚注意到phoneBook是一个指针容器,所以别忘了做

      delete phoneBook[ position ];
      

      在擦除此元素之前(除非您使用智能指针;)。

      【讨论】:

        猜你喜欢
        • 2018-11-14
        • 2021-05-01
        • 1970-01-01
        • 2012-05-18
        • 1970-01-01
        • 1970-01-01
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多