全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4531
推到 Plurk!
推到 Facebook!

請問 vector 裡的二個物件怎麼互換

尚未結案
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-09 22:05:37 IP:140.124.xxx.xxx 未訂閱
例如:現在我要把第x個和第x+1個互換 請問要怎麼做?    我試過  
temp = my_vector.at(x);
my_vector.erase(&my_vector[x]);
insert(my_vector.begin() x,my_vector.at(x 1));
my_vector.erase(&my_vector[x]);
insert(my_vector.begin() x 1,temp);
 
compile 的時候是沒問題,但執行的時候會有錯 老實說不知道錯在那裡? 不知道有沒有比較正統的做法 謝謝
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-10 06:42:52 IP:211.76.xxx.xxx 未訂閱
cowbjt你好:    試試
swap(my_vector[x],my_vector[x 1])
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-10 12:28:16 IP:140.124.xxx.xxx 未訂閱
版主你好:    不知道你的swap 前有沒有my_vector.    我之前試過
 
my_vector.swap(my_vector[x],my_vector[x 1]); 
compile會有錯 如果是沒有my_vector.直接swap的話 compile過了 但執行的時候說在vector.h裡有std::out of rang 的錯 而vector.h是標準c 的,我想應該不會是這的問是吧??
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-10 12:53:46 IP:211.76.xxx.xxx 未訂閱
cowbjt你好:    swap應該是沒有問題的,我測式結果也是ok  
 
//---------------------------------------------------------------------------
#include 
using namespace std;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    vector array(5);
    array[0] = 1;
    array[1] = 2;
    swap(array[0],array[1]);
    Caption = array[0]; // 輸出2
}
重點在你的container的宣告是什麼?有些container是不能用indexing的operator(就是[]),有些則是不能swap。
fffhghgjh
一般會員


發表:2
回覆:33
積分:17
註冊:2004-12-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-10 14:33:12 IP:61.220.xxx.xxx 未訂閱
void swap(vector& x);    Exchanges self with x, by swapping all elements.    void swap(reference x, reference y);    Swaps the values of x and y. This is a member function of vector<bool> only.
 
提供給你參考
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-10 16:07:44 IP:140.124.xxx.xxx 未訂閱
vector<bool> only 那為什麼版主的int 可以呢?? 對了,我vector 裡放的是我自定的class 會有問題嗎?
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-10 17:53:49 IP:211.76.xxx.xxx 未訂閱
swap有分兩類,一類是定在algorithm裡,BCB的Help就有資料了:  
#include 
template 
void swap (T& a, T& b);    Description    The swap algorithm exchanges the values of a and b. The effect is:    T tmp = a
a = b
b = tmp
另一類swap是container的member function,這類是專門給container作swap用的,在效率上比使用algorithm的swap還好,所以才特別訂作。
 
至於vector有個特別swap成員函式的原因是vector的實作是
"特化"的:這說來話長...        標準C加加中已經不建議使用vector而是用bitset,但bcb使用的
STL版本還是特別訂作了一個vector。這個vector的member
不適用algorithm的swap來交換其成員(你可以試試把我的例子中的int改
成bool,一定過不了compiler)。因此才在vector的class中特別加
上swap這個member function。
回到主題,一個vector的成員要能swap有不少要件。其中如果你是用到自訂的型別,那要確定你的class是否是copy safe(我想會出錯誤可能問題是出在這)。基本上你可以檢查看看class的成員是否有pointer,如果有那就要實作big three(copy constructor, assignment perator, destructor)..。除此之外,還有不少要注意的地方,寫這個主題可能要花上一個文章來探討... 當然如果你能放上你
fffhghgjh
一般會員


發表:2
回覆:33
積分:17
註冊:2004-12-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-01-10 18:19:11 IP:61.220.xxx.xxx 未訂閱
這裡是假設 vector vec_bool; 就可以用 vec_bool.swap(vec_bool[0],vec_bool[1]);
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-01-10 19:36:08 IP:140.124.xxx.xxx 未訂閱
看來要swap還真的有點麻煩 不過,如果是手動呢 就是如同我一開始講的 先把x刪除,再insert 這樣應該要可以吧 但錯誤的地方卻跟用swap 是一樣的?
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-01-10 21:07:50 IP:211.76.xxx.xxx 未訂閱
忘了提一點,insert是把東西複製一份,放在container中。 換句話說,insert也需要copy safe的...
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-01-10 21:39:54 IP:221.169.xxx.xxx 未訂閱
pwipwi大大說的已經是正解了 我這裡的測試也是正常的
int main()
{
  int a[5]={1,2,3,4,5};
  vector b(a, a 5);
  swap(b[3], b[4]);
  copy(b.begin(), b.end(), ostream_iterator(cout, " "));
  cout << endl;
  system("pause");
  return 0;
}
會發生std::out of rang 錯誤通常是你給的索引值超出陣列裡的元素數量 但是我查規格書,用[]運算子取值的時候,並不會進行範圍檢查 理論上應該不會出現這樣的錯誤訊息 只有at運算子才會進行範圍檢查,如果可以的話,把你測試的程式碼都貼上來看看 另外,針對你第一個程式碼我另外寫了一個測試程式,你看一下:
int main()
{
  int a[5]={1,2,3,4,5};
  vector b(a, a 5);
  int x=0;
  int temp=b.at(x);
  b.erase(&b[x]); //把第一個元素(1)刪除,result:2 3 4 5
  b.insert(b.begin() x, b.at(x 1)); //將第二個元素(3)插入位置x(0),result:3 2 3 4 5
  b.erase(&b[x]); //result:2 3 4 5
  b.insert(b.begin() x 1, temp); //result:2 1 3 4 5
  system("pause");
  return 0;
}
注意!第一次erase的時候,後面的元素會往前遞補 所以第一次insert的時候,取到的元素是3,而不是2! 我建議用swap就好 如同上面的例子,你刪除或插入元素的時候,後面的元素都會跟著變動 如果你有很多元素的時候,電腦光搬這些資料就行了 其他事都不用做了 vector容器並不適合這種用途 而fffhghgjh所言
vector 
有個特化版本的swap 則跟你的程式一點關係都沒有,可以暫不理會.. 事實上,swap通常都被定義為
template 
void swap (T& a, T& b);
能接受任何的型別 vector::swap則只接受一個參數 所以 my_vector.swap(my_vector[x],my_vector[x 1]); 編譯不過是正常的 發表人 - justdo 於 2005/01/10 21:55:10
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-01-12 15:23:13 IP:140.124.xxx.xxx 未訂閱
我現在的做法是用  
 
swap(my_vector[x],my_vector[x 1]);
的方式互換。 但還是會有std::out of rang 可能就是版主說的copy safe 的問題 但我想請問一下,什麼是copy safe ?? 要如何解決這種問題?? 謝謝
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-01-12 16:16:35 IP:211.76.xxx.xxx 未訂閱
建議..可以話請貼上程式碼吧~ 不然還是瞎子摸象.. 找不到真正問題所在。 發表人 - pwipwi 於 2005/01/12 16:20:07
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-01-16 19:07:28 IP:140.124.xxx.xxx 未訂閱
我的程式碼實在太多了 好像8xx 行    而我要swap的部分其實很簡單 我是要做一下簡單的泡沫排序 (後來我用qsort完成了,但我還是想知道vector要如何swap,所以我問了一下) 我那一段程式碼是  
    bool chang = true;
    while(chang)
    {
        chang = false;
        for(int x=0;x    而我的vector裡放的是我自定的類別
 
 
class Area
{    struct aLine
{
    int x_left;
    int x_right;
    int y;
};    public:
    bool isDone;
    bool fit(int x1,int x2,int yline);
    void setMemberThreshold(int x,int y);
    int max_x;
    int max_y;
    int min_x;
    int min_y;
    //constructor
    Area();
    void clear();    private:
    vector member;
    aLine tempLine;
    int x_threshold;
    int y_threshold;
    void add(int x1,int x2,int yline);    };
不知道這樣有沒有幫助
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-01-17 00:37:43 IP:211.76.xxx.xxx 未訂閱
下面這行可能是錯誤所在:  
 
int a2 = (my_vector.at(x 1).max_x - my_vector.at(x 1).min_x)*(my_vector.at(x 1).max_y - my_vector.at(x 1).min_y);
x的值可以到size()-1,如果讀取my_vector.at(x 1)就會丟出range error。
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-01-17 12:54:39 IP:140.124.xxx.xxx 未訂閱
阿呀 居然沒看到這個 真是遜掉了 不過,我改成了size()-2,結果還是一樣?? ....怪了
系統時間:2017-10-24 19:31:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!