我有一个功能,例如:
void foo(int checkInt, vector<int> vect, int x) {
EXECx = x;
EXECcheckInt = checkInt;
if (EXECcheckInt > 0) {
//do something to vect
} else {
Timer.rset();
}
}
可以看出,除非vect
大于0,否则checkInt
会被保留。因此,如果我想传递checkInt
0,那么好像我不必担心vect
。
因此,在我看来,vect
的此函数中需要一些伪值,所以什么值有效,还是需要传递伪向量?我的想法是只传递0,但是我猜那是行不通的。
我尝试像foo(0,(vector<int>)0,0)
中那样强制转换它,但是令我惊讶的是,当我尝试打印出vect
时,它只是显示为空(其中没有0)这样写:
void foo(int checkInt, vector<int> vect, int x) {
for (auto i = vect.begin(); i != vect.end(); ++i)
std::cout << *i << ' ';
}
我应该怎么做?
我正在使用C ++ 98。
答案 0 :(得分:2)
更改函数声明以接受向量的引用,以避免不必要的复制内存,如下所示:
void foo(int checkInt, vector<int>& vect, int x)
如果您已经有矢量对象,那么即使不使用它也可以通过它。如果您需要构建虚拟向量,则可以调用以下函数:
vector<int> v;
foo (0, v, x);
答案 1 :(得分:2)
代码看起来像该函数决定是否使用向量,但是您要执行的操作表明是由调用方决定是否使用向量。到底是谁我认为您有一个设计问题,请解决该问题,然后就不再需要将0强制转换为向量了。 (例如,制作两个函数,一个函数使用向量,另一个函数不使用向量作为参数)
无论如何,您可能想看看std::optional
,它仅在C ++ 17之后可用,但是它可能给您一些启发,使您可以以一种干净的方式处理这种情况。 “肮脏”的方法是传递一个指针,然后检查它是否在函数内部为nullptr
。
您的演员表不会创建填充0
的向量,而是创建大小为0
的向量。
答案 2 :(得分:0)
您可以提供一个无需向量即可调用的重载。您可以将公共部分重构为子功能:
void foo(int checkInt, vector<int> vect, int x) {
if (checkInt > 0) {
bar(checkInt, x);
//do something to vect
} else {
foo(checkInt, x);
}
}
void foo(int checkInt, int x) {
assert(checkInt <= 0); // maybe unnecessary. depends on what you need
bar(checkInt, x);
Timer.rset();
}
void bar(int checkInt, int x) {
EXECx = x;
EXECcheckInt = checkInt;
}
// with vect
foo(checkInt, vect, x);
// without vect
foo(0, 0);
但是令我惊讶的是,当我尝试打印vect时,它显示为空(里面没有0)
目前尚不清楚为什么会让您感到惊讶。根据文档,接受整数的vector的构造函数会在构造的vector中创建许多元素。具有0个元素的向量为空。
请注意,您可能应该重新考虑是否要按值传递向量。您确定需要副本吗?