指针 - 参考向量

时间:2012-10-22 22:02:20

标签: c++ pointers

我习惯用C#或Java编程,所以我在C ++中做得很糟糕。我相信这很容易,但我无法做到这一点。请帮帮我。

我有这个:


void swap(vector  * vet, int i, int j)
{
    int temp = vet[i];
    vet[i] = vet[j];
    vet[j] = temp;
}

我用这种方式调用方法:


swap(&vet, j, j - 1);

我想要的是使用指针传递向量而不是使用值。

Obs:代码编译得很好,没有“*”和“&”。

请不要说我必须至少尝试学习指针,因为我做到了。我只是不能让这个该死的东西工作!

4 个答案:

答案 0 :(得分:5)

你应该通过引用而不是“通过指针”来获取向量。

void swap(std::vector<int>& vet, std::size_t i, std::size_t j)
{
    using std::swap;
    swap(vet[i], vet[j]);
}

http://en.cppreference.com/w/cpp/algorithm/swap

注意更惯用:

http://en.cppreference.com/w/cpp/algorithm/iter_swap

答案 1 :(得分:4)

到目前为止,每个人都通过告诉您使用引用来做出回应,这是正确的,但是它们无法解释为什么您的代码不起作用。这里的问题是你不理解指针算法。

假设我们有一个指向10 int s的指针:

// best to use a vector for this, but for the sake of example...
int *p = new int[10];

现在,如果我们想要改变那块内存中第二个int的值,我们可以写:

*(p + 1) = 20;

或等效:

p[1] = 20;

请参阅?这两行做同样的事情。将n添加到指针会使指针的地址增加n * sizeof *p个字节。指针算法很方便,因为它隐藏了sizeof位,允许您使用逻辑单元(元素)而不是字节。

所以,知道这一点,回到你破碎的代码:

vet[i] = vet[j];

这指示i * sizeof *vet字节远离指针,即 i完全向量远离基地址。显然这是错误的,你想在向量上调用operator[],即将其视为一个数组。但它不是一个数组,所以正确的语法是:

(*vec)[i]

或者

vec->operator[](i);

那说......只是使用参考。更安全(对象保证有效)和惯用。

答案 2 :(得分:3)

你可以试试像....

void swap(vector<int> &vet, int i, int j)
{
    int temp = vet[i];
    vet[i] = vet[j];
    vet[j] = temp;
}

并将您的交换功能称为

swap(vet,i,j);

底线:使用引用变量。它们更像是Java中的引用。

答案 3 :(得分:2)

事实上,在C ++中你只是说

using std::swap;

swap(vet[i], vet[j]);