我可以将0传递给需要向量类型参数的函数吗?

时间:2019-03-21 10:32:06

标签: c++ c++98

我有一个功能,例如:

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。

3 个答案:

答案 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个元素的向量为空。


请注意,您可能应该重新考虑是否要按值传递向量。您确定需要副本吗?