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

請問一下vector的用法

尚未結案
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-27 17:59:22 IP:211.22.xxx.xxx 未訂閱
請問一下我自訂一個struture,然後我用Vector的方式去建立一序列的struture
typedef struct{
AnsiString  ID;
unsigned char Flag;
double KP;
double XP;
}Op_Type;    vector OpVector;
,目前有兩個程序要處理,當"資料一"進來時,我將資料放入Vector,我是用pushback的方式放在後面,當"資料二"進來時我要在vector找同樣的id,處理第二個程序,請問一下我要用什麼方式知道"資料二"的ID對應的資料一的ID是第幾個序列,即OpVecto[i]的為多少, 還是用其它的方法可以作到我可以找同樣id的資料來作處理。謝應
justdo
高階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-27 19:55:10 IP:221.169.xxx.xxx 未訂閱
建議你改用map,並且以ID當成key、其他的東西整理成struct當成value
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-27 23:11:59 IP:59.121.xxx.xxx 未訂閱
謝謝justdo兄的解答,但是可以請您簡述一下如何作嗎 另外我把問題複雜化了,應該是這樣, 如果OpVector[3].ID = "Test" 那我如何找出ID= "Test"是位於OpVector的第四個序列呢 謝謝
psl
一般會員


發表:6
回覆:30
積分:7
註冊:2003-06-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-28 00:01:04 IP:220.143.xxx.xxx 未訂閱
//---------------------------------------------------------------------------    #include 
#include 
#include 
#pragma hdrstop
//---------------------------------------------------------------------------
using namespace std;    typedef struct{
    AnsiString  ID;
    unsigned char Flag;
    double KP;
    double XP;
}Op_Type;    #pragma argsused
int main(int argc, char* argv[])
{
    AnsiString WantedID = "Cat";        Op_Type b;
    vector OpVector;        b.ID = "Pig";
    OpVector.push_back(b);        b.ID = "Cat";
    OpVector.push_back(b);        b.ID = "Dog";
    OpVector.push_back(b);        b.ID = "Elephant";
    OpVector.push_back(b);        b.ID = "Cat";
    OpVector.push_back(b);        for (int i=0; i    Schuamcher 你好
不知道你要的是不是這樣 ^_^
"加號"顯示不出來 orz     
        
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-28 09:33:43 IP:211.22.xxx.xxx 未訂閱
謝謝psl兄及justdo兄的答覆,我看了一下vector的書,我重新改了程式碼 
typedef struct{
AnsiString  ID;
unsigned char Flag;
double KP;
double XP;
}Op_Type;    vector OpVector;
typedef vector::iterator iter ;    Op_Type  Test;
Test.ID = "TG5";    OpVector.push_back(Test);    iter ite1 = find(OpVector.begin(), OpVector.end(), "TG5");    
請問一下最後一段在編碼時,會出現問題,請問一下是那邊出問題了,還是有那些表頭檔我沒有加進來,還是structure是不能用find這個指令的,謝謝
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-28 10:02:05 IP:61.228.xxx.xxx 未訂閱
建議你的方向朝MAP容器去作,給你一個MAP的範例:
#include 
#include 
#include 
using namespace std;
typedef struct{
string  ID;
unsigned char Flag;
double KP;
double XP;
}Op_Type;    int main(int argc, char *argv[])
{
    Op_Type in;
    map mm;
    map::const_iterator itr;
    typedef pair pr;
    for(int i=0;i<5;i  ){
            cout<<"ID:";
            cin>>in.ID;
            cout<<"Flag:";
            cin>>in.Flag;
            cout<<"KP:";
            cin>>in.KP;
            cout<<"XP:";
            cin>>in.XP;
            mm.insert(pr(in.ID,in));
            }
    for(itr=mm.begin();itr!=mm.end();itr  )
    cout<first<>in.ID;
    itr=mm.find(in.ID);
    cout<<"ID:"<<(itr->second).ID<second).Flag<second).KP<second).XP<     
        
justdo
高階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-28 22:37:31 IP:221.169.xxx.xxx 未訂閱
用vector當然也是可以,只是以你的例子來說map其實是比較合適的 用vector的作法請參照psl 用map的方法可以參考GeorgeKu的作法 我在這邊只解釋你的方法有誤的地方    首先find的函式定義為
template 
  InputIterator find(InputIterator first, 
                      InputIterator last,
                      const T& value);
因此,第三個參數,理論上型態該為vector內部元素(element)的型態 以你的例子來說,應該為Op_Type,然而你是這樣呼叫的: iter ite1 = find(OpVector.begin(), OpVector.end(), "TG5"); 傳入的type為char* find在比對的時候,無法進行Op_Type與char*的比對,故會發生錯誤 此種情況下,應該採用find_if函式 ...有點晚了,剩下的改天再補齊...
justdo
高階會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-28 23:18:49 IP:221.169.xxx.xxx 未訂閱
睡不著..  今天把它補完好了 class="code"> struct Op_Type { AnsiString ID; unsigned char Flag; double KP; double XP; }; struct Op_Type_Compare:public binary_function { bool operator () (Op_Type& v, char* k) { return (v.ID == k); } }; int main() { vector OpVector; typedef vector::iterator iter ; Op_Type Test; Test.ID = "TG5"; OpVector.push_back(Test); iter ite1 = find_if(OpVector.begin(), OpVector.end(), bind2nd(Op_Type_Compare(), "TG5")); if (ite1 != OpVector.end()) cout << (*ite1).ID << endl; return 0; } 或把仿函式寫在本身類別之內
struct Op_Type
{
AnsiString  ID;
unsigned char Flag;
double KP;
double XP;
bool ID_Is(char* k) const
{
  return (ID == k);
}      
};
int main()
{
vector OpVector;
typedef vector::iterator iter ;
Op_Type  Test;
Test.ID = "TG5";
OpVector.push_back(Test);
iter ite1 = find_if(OpVector.begin(), OpVector.end(), bind2nd(mem_fun_ref(&Op_Type::ID_Is), "TG5"));
if (ite1 != OpVector.end())
  cout << (*ite1).ID << endl;
return 0;
}
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-29 15:37:30 IP:211.22.xxx.xxx 未訂閱
謝謝justdo兄犧牲睡眠的時間來幫助我這個新手,也謝謝GeorgeKu,psl兄的大力幫助,因為我對map的功能的仍處於矇攏狀態,但我會試著學看看,再一次感謝justdo的指導,雖然我對vector仍然不太熟,但有了justdo兄的幫助,我會更了解Vector用法
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-01 16:31:06 IP:211.22.xxx.xxx 未訂閱
仍否在請問justdo兄一下,當我代入"TG5"時,程式是沒問題,可是當我用變數時,則出現問題,例代入TStringGrid->Cells[0][0] 
 
iter ite1 = find_if(OpVector.begin(), OpVector.end(), bind2nd(mem_fun_ref(&Op_Type::ID_Is), TStringGrid->Cells[0][0]));
則會現問題,我試過很多其它的方法,但是就是出現下面的訊息 [C Error] _function.h(173): E2031 Cannot cast from 'const AnsiString' to 'char *' [C Error] _function.h(173): E2285 Could not find a match for 'binder2nd >::binder2nd(const const_mem_fun1_ref_t,undefined)' 請問一下我該如何解決這個問題呢,謝謝
justdo
高階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-05 07:23:26 IP:221.169.xxx.xxx 未訂閱
你好,錯誤訊息已經告訴你問題在哪了 TStringGrid->Cells[0][0] 傳回的是 const AnsiString ,而非 char* 把 bool ID_Is(char* k) const { return (ID == k); } 改成 bool ID_Is(const AnsiString& k) const { return (ID == k); } 看看
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-05 08:52:42 IP:211.22.xxx.xxx 未訂閱
感謝justdo兄的幫忙,謝謝
系統時間:2024-06-02 1:10:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!