1

抱歉标题混乱,不知道取什么标题。我有这个功能:

static void smooth5(IntVector*& v)
{
    IntVector* tmp = new IntVector();
    for(int i=0; i<v->size(); i+=2)
        tmp->push_back(v->at(i));
    delete v;
    v = tmp;
}

主要是我这样做:

IntVector* v = new IntVector();

v->push_back(0);
v->push_back(1);
v->push_back(2);
v->push_back(3);

smooth5(v);

//print the contents of v

当我打印v的内容时,输出是0 2。但是我不明白什么

IntVector*& v

实际上意味着当 v 是指向堆上对象的指针时。有人可以解释一下吗?

4

3 回答 3

3

IntVector*&声明对指针的引用。使用 this 作为函数参数允许smooth5修改调用者的v.

它类似于但比将指针传递给指针 - 更具可读性IntVector**

在您的示例中,smooth5删除调用者IntVector并将其指向其tmp变量。

于 2013-02-01T15:12:47.170 回答
1

这不是指向引用的指针,而是对指针的引用。这意味着不是将指针的副本传递给函数,而是传递对它的引用。因此,您对函数中的指针所做的任何修改smooth5都会影响您传递给它的参数,在这种情况下是指针v

于 2013-02-01T15:14:39.160 回答
0

IntVector*& v的代码中的含义取决于谁在阅读它。当编译器读取它时,这意味着它v是对一个指针的引用IntVector(它是一个 typedef 到 std::vector<int>?)。当我阅读它时,这意味着代码的作者可能不了解 C++ 的工作原理,并且正在尝试改编不合适的 Java 或 C# 习惯用法。写这个的惯用方式是:

void smooth5( IntVector& v )
{
    IntVector results;
    for ( int i = 0; i < v->size(); i += 2 ) {
        results.push_back( v[i] );
    }
    v.swap( results );
}

任何涉及向量指针的代码都是高度可疑的。

于 2013-02-01T15:27:36.913 回答