将向量的迭代器发送到函数中。 (C ++)

时间:2019-03-07 08:00:56

标签: c++ vector iterator

这更像是一个后续问题 Is it possible to send part of vector as a vector to a function? 但这是不同的,我不能在那里问。

我提供了针对我的情况的有趣的具体答案:


使用迭代器作为基于范围的函数的参数,并传递所需的范围。您在函数中的代码变为

funcWithRange(v.cbegin()+ 10,v.cbegin()+ 50); 具有功能签名

void funcWithRange(首先std :: vector :: const_iterator,最后std :: vector :: const_iterator) 可以通过将其设为具有矢量成员类型作为其模板参数的功能模板,或者进一步扩展到支持这种范围迭代的任何容器,来概括这一点。如评论中所述,有很多这种模式的例子。

std :: distance(first,last);将返回所需的更改大小。我认为您不进行实物复制就无法满足您的要求。


这很好,但是我想知道如何“使用”向量(在新函数中我的向量称为“数字”。从我的程序中看,我现在只使用数字[i],数字[i + 1]和numbers.size()。当我有两个in参数时,我不知道该怎么办,我想我可以使用first +?之类的东西,但是由于它是一个递归函数,我希望能够像对待向量。

第二个问题是使用命名空间std;时如何编写函数签名?通常,我只截断::和::之前的所有内容,但是这次我在第一次和最后一次都看到了两次。


对于与已经回答的其他问题如此相似的问题,我感到抱歉。我首先尝试向发帖人发送电子邮件,他建议我在此处发帖。

更新:

仍然感谢您的回答,我仍然看不到如何使用它。不是因为您的回答不好,而是因为我对它的描述不够好。我还应该在代码中附加以下功能:


bool deeperLook (vector<int> numbers, int target)
{
    for (int i = 0 ; i < numbers.size() ; i++)
    {
        if (numbers[i] == target)
        {
            return true;
        }
        if (numbers[i] < target)
        {
            deeperLook({numbers.cbegin() + i, numbers.cbegin() + numbers.size()} , target - numbers[i]);
        }
    while(numbers[i] == numbers[i+1])
    {
        i++;
    }
    }
    return false;
}

此函数将获取一个排序的int向量(首先是最大的),然后尝试创建相加在一起的数字的组合,以达到特定的数字(目标)。 bool deeperLook(向量数字,int目标) 如您所见,该函数需要一个向量作为indata。该向量被发送到程序的另一部分,并且它是递归的,因此我需要将其作为数据输入。我该如何使用迭代器?该代码可以正常工作,但是创建所有thoose的内存效率很低,因为它实际上只是同一向量的所有部分。

也有人说我应该避免“使用命名空间std;”。为什么?用它编写代码似乎容易得多。

1 个答案:

答案 0 :(得分:0)

您可以使用(MyClass) -> () -> () first[i]适用于随机访问迭代器,也可以使用operator[]获得“大小”。请记住,迭代器操作基于指针,因此,如果可以使用指针进行操作,则可以使用随机访问迭代器进行操作。