1

我习惯用 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

4 回答 4

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

于 2012-10-22T22:07:01.197 回答
4

到目前为止,每个人都通过告诉您使用引用来回应,这是正确的,但他们未能解释为什么您的代码不起作用。这里的问题是您不了解指针运算。

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

// 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);

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

于 2012-10-22T22:17:38.723 回答
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 中的引用。

于 2012-10-22T22:07:47.600 回答
2

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

using std::swap;

swap(vet[i], vet[j]);
于 2012-10-22T22:14:40.917 回答