【问题标题】:Can I pass 0 to a function expecting a vector type parameter?我可以将 0 传递给需要向量类型参数的函数吗?
【发布时间】:2019-03-21 10:32:05
【问题描述】:

我有一个函数,比如:

void foo(int checkInt, vector<int> vect, int x) {
    EXECx = x;
    EXECcheckInt = checkInt;
    if (EXECcheckInt > 0) {
         //do something to vect
    } else {
        Timer.rset();
    }
}

可以看出,除非checkInt 大于0,否则vect 会被单独留下。所以,如果我想通过checkInt 0,那么我似乎不必担心vect

因此,在我看来,我需要一些虚拟值来为vect 输入这个函数,那么什么值可以工作,或者我需要传递一个虚拟向量?我的想法是通过 0,但我猜那是行不通的。

我尝试将它转换为foo(0,(vector&lt;int&gt;)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。

【问题讨论】:

  • 听起来你需要两个独立的函数
  • 什么是“做点什么”?修改vect?
  • @Jabberwocky 我试图复制的函数(它在另一种语言中)将 vect 的内容复制到另一个向量 - 这是“对 vect 做一些事情”
  • (vector&lt;int&gt;)0 实际上解析为static_cast,这只是调用constructor #2 here 的一种奇怪方式,其参数是所需的大小。
  • 也许如果你改变你的函数签名为 void foo(int, vecto*, int x) 你可以传递 NULL 作为向量参数。

标签: c++ c++98


【解决方案1】:

代码看起来像函数决定是否使用向量,但你想要做的表明是调用者决定是否使用向量。究竟是谁?我认为你有一个设计问题,修复它然后你不需要再将 0 转换为向量。 (例如做两个函数,一个取向量,另一个不取向量作为参数)

无论如何,你可能想看看 std::optional,它只在 C++17 之后才可用,但它可能会给你一些关于如何以干净的方式处理这种情况的灵感。 “脏”的方式是传递一个指针,然后检查它是否是函数内部的nullptr

您的演员表不会创建一个用0 填充的向量,而是一个大小为0 的向量。

【讨论】:

    【解决方案2】:

    更改函数声明以接受向量的引用,以避免像这样不必要地复制内存:

    void foo(int checkInt, vector<int>& vect, int x)
    

    如果你已经有一个矢量对象,那么即使它没有被使用,你也可以传递它。如果你需要构造一个虚拟向量,那么你可以这样调用函数:

    vector<int> v;
    foo (0, v, x);
    

    【讨论】:

    • 这甚至不会编译。临时对象不能绑定到可变引用。
    • @SamVarshavchik 你说得对,我忽略了这一点;已编辑。
    【解决方案3】:

    您可以提供一个可以在没有向量的情况下调用的重载。您可以将公共部分重构为子函数:

    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)

    尚不清楚为什么这会让您感到惊讶。根据文档,接受整数的向量构造函数会在构造的向量中创建那么多元素。包含 0 个元素的向量为空。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多