我习惯用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:代码编译得很好,没有“*”和“&”。
请不要说我必须至少尝试学习指针,因为我做到了。我只是不能让这个该死的东西工作!
答案 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
注意更惯用:
答案 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]);