将(已排序的)std :: vector传递给方法

时间:2018-10-04 05:57:28

标签: c++

请考虑以下情形:

class A
{
public:
    void FunA()
    {
        auto v = std::vector<int>();
        // Fill the vector
        B().FunB(v);
    }
};

class B
{
public:
    void FunB(const std::vector<int>& v)
    {
        // ...
        std::sort(v.begin(), v.end());
        // ...
        // call std::binary_search() on v
    }
};

FunB中,我只想使用v来搜索其内容,因此我想将其作为const &进行传递,因此很明显我不打算修改它。但是std::sort()const std::vector上不起作用。

可能的解决方案:

  1. 删除const->可以在v内修改B::FunB(),不是这种情况。

  2. 在传递给v->时始终期望排序的B::FunB()->这只能通过编写注释并希望调用者读取它来完成。如果他不这样做,行为就会改变!

解决这个问题的正确方法应该是什么?

2 个答案:

答案 0 :(得分:0)

嗯,您介绍的两种可能性并不详尽。为什么不简单地复制载体?更改微不足道:

void FunB(std::vector<int> v)

一切都会正常。如果不是很大,那么复制的时间成本与排序相比就可以忽略不计,如果您可以节省额外的内存使用量。


我在评论中注意到您提到向量将很大。不过,在许多情况下,这仍然是可行的选择。

答案 1 :(得分:0)

创建一个类,该类通过引用获取向量并存储对该类的引用。 在构造函数中,它可以执行任何您想要的操作,例如对向量进行排序。

然后,类B中的函数应复制该新类。因此,将创建一个临时对象(调用采用向量的构造函数),该对象将通过引用存储该向量。作为副作用,它将对其进行排序。

然后您可以自由对它进行二进制搜索或...

将binary_search添加到新类中。

class Vector_Sorter
{
public:
    std::vector< int >& Vector;
    Vector_Sorter(std::vector< int >& vec) 
        : Vector(vec) 
    {
        std::sort(Vector.begin(), Vector.end());
    }
};

class B
{
public:
    void FunB(Vector_Sorter v)
    {
        // ...
        // ...
        // call std::binary_search() on v.Vector
    }
};

class A
{
public:
    void FunA()
    {
        auto v = std::vector< int >();
        // Fill the vector
        B().FunB(v);
    }
};