请考虑以下情形:
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
上不起作用。
可能的解决方案:
删除const
->可以在v
内修改B::FunB()
,不是这种情况。
在传递给v
->时始终期望排序的B::FunB()
->这只能通过编写注释并希望调用者读取它来完成。如果他不这样做,行为就会改变!
解决这个问题的正确方法应该是什么?
答案 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);
}
};