2011-06-03 45 views
29

這是我的交換功能:C++想在矢量交換價值

template <typename t> 
void swap (t& x, t& y) 
{ 
    t temp = x; 
    x = y; 
    y = temp; 
    return; 
} 

這是我的功能(在側附註五店字符串)調用交換值,但每當我嘗試使用值調用在向量中,我得到一個錯誤。我不確定我做錯了什麼。

swap(v[position], v[nextposition]); //creates errors 
+26

你的錯誤是什麼? – 2011-06-03 08:43:25

+5

你的代碼中有沒有'使用namespace std'的地方?因爲你可能有名字衝突。 – Benoit 2011-06-03 08:47:42

+8

順便說一句你不需要'return;'語句在你的函數結尾 – 2011-06-03 09:02:35

回答

74

我想你在找什麼是iter_swap,你還可以找到在<algorithm>
您只需傳遞兩個迭代器,每個迭代器指向您想要交換的元素之一。
因爲你有兩個元素的位置,你可以做這樣的事情:

// assuming your vector is called v 
iter_swap(v.begin() + position, v.begin() + nextPosition); 
// position, nextPosition are the indices of the elements you want to swap 
+6

我有這個相同的問題,並且有很多推薦std :: swap的答案(就像這裏的最高投票人一樣),但std :: swap不能直接用於交換矢量的兩個元素的內容。你的答案與std :: iter_swap一樣。 – latreides 2014-01-09 20:23:55

+0

我很驚訝沒有人提到它。 – 2014-02-09 22:09:08

+1

@latreides你能否澄清一下你的意思是「std :: swap無法(直接)交換一個向量的兩個元素的內容」? – 2016-01-16 06:44:25

32

兩個提議的可能性(std::swapstd::iter_swap)工作,他們只是有一個稍微不同的語法。 讓我們交換一個向量的第一個和第二個元素,v[0]v[1]

我們可以交換基於對象的內容:

std::swap(v[0],v[1]); 

或交換基於底層迭代器:

std::iter_swap(v.begin(),v.begin()+1); 

試試:

int main() { 
    int arr[] = {1,2,3,4,5,6,7,8,9}; 
    std::vector<int> * v = new std::vector<int>(arr, arr + sizeof(arr)/sizeof(arr[0])); 
    // put one of the above swap lines here 
    // .. 
    for (std::vector<int>::iterator i=v->begin(); i!=v->end(); i++) 
    std::cout << *i << " "; 
    std::cout << std::endl; 
} 

你得到的這兩次前兩個元素交換:

2 1 3 4 5 6 7 8 9 
+0

std :: swap()對迭代器不起作用,請考慮使用std :: iter_swap(),而不是像本頁其他答案中所建議的那樣使用std :: iter_swap()。 – Mar 2016-03-12 03:57:41

+0

@Mar Superfly建議:請注意,std :: iter_swap(it1,it2)等價於std :: swap(* it1,* it2)。所以std :: swap可以正常工作。 – leetNightshade 2016-09-16 21:07:18

3

後通過參考

swap(vector[position],vector[otherPosition]); 

使向量會產生預期的結果。