2013-12-17 47 views
0

不幸的是,這隻讀頂點A - F但不是G.基本上在這個循環while(input.find(' ', pos1) != string::npos)其終止一個字符比我想要它,但我不知道該怎麼改變。我創建了這個代碼只是爲了通過重定向來讀取輸入,併爲圖形創建一個頂點和一個字符向量的映射。這不是很優雅,所以如果你想建議一個更有效的方式來閱讀輸入,那也是很好的。謝謝!讀入除此輸入字符串的最後一個字符之外的所有字符?

void MSTapp::processFile() 
{ 
int pos1; 
int pos2; 
map<char, Vertex*> adjacencyList; 
vector<char> listOrder; 
string input; 
bool test = false; 
while (getline(cin, input)) { 
    pos1 = pos2 = 0; 
    if(std::string::npos != input.find_first_of("")) 
    { 

     char source = input[0]; 
     char destination = input[2]; 
     stringstream ss(input.substr(4));  
     int weight; 
     ss >> weight; 
     Edge newEdge(destination, weight); 
     adjacencyList[source]->addEdge(destination, newEdge); 
     Edge roadBack(source, weight); 
     adjacencyList[destination]->addEdge(source, roadBack); 
    } 
    else 
    { 
     while(input.find(' ', pos1) != string::npos) 
     { 
      pos2 = input.find(' ', pos1); 
      char vertex = input[pos1]; 
      listOrder.push_back(vertex); 
      Vertex* newVertex = new Vertex(vertex); 
      adjacencyList.insert(make_pair(vertex, newVertex)); 
      pos1 = pos2 + 1; 
     }; 
    }; 
}; 
Graph graph(listOrder, adjacencyList); 
prim(graph, adjacencyList[listOrder[0]]); 
} 

輸入

A B C D E F G 
A B 3 
A E 4 
B C 7 
B E 6 
B F 5 
C D 9 
C F 8 
D F 9 
D G 4 
E F 6 
F G 8 

回答

1

在迭代是while(input.find(' ', pos1) != string::npos)無法找到一個空格字符,input[pos1]指向最後一個非空格字符。

這是因爲空格在字符之間,而不是在他們之後。這就是所謂的「fencepost錯誤」。它來自一個邏輯謎題:「假設你想沿10米長的地方放一個圍欄,每1米有一個圍欄,你需要多少圍欄?」 10似乎是明顯的答案,但11是更好的答案,因爲10個差距需要11個fenceposts。這裏有同樣的想法

一個更明顯的寫邏輯的方法是搜索字符,而不是搜索它們之間的空格。例如:

while((pos2 = input.find_first_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ", pos1)) != string::npos) 
    { 
     char vertex = input[pos2]; 
     listOrder.push_back(vertex); 
     Vertex* newVertex = new Vertex(vertex); 
     adjacencyList.insert(make_pair(vertex, newVertex)); 
     pos1 = pos2 + 1; 
    } 

請注意,你將不得不改變聲明pos1pos2std::string::size_type pos1, pos2;。而實際上,你並不需要兩個獨立的pos變量:

std::string::size_type pos = 0; 

    while((pos = input.find_first_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ", pos)) != string::npos) 
    { 
     char vertex = input[pos]; 
     listOrder.push_back(vertex); 
     Vertex* newVertex = new Vertex(vertex); 
     adjacencyList.insert(make_pair(vertex, newVertex)); 
     ++pos; 
    } 
+0

感謝提供我現有的代碼,有效的解決方案,但我有一種感覺,我想通過解決這個使用字符串流得到更好的實踐。我會試一試,但是如果你有一個stringstream的建議解決方案,那將非常棒,可以幫助我學習! – CodeManiak

+0

第二個想法爲什麼改變已經工作的東西......這是很漂亮的語義代碼,有時這本身很方便 – CodeManiak

+0

真棒修復。它現在正在工作,並且結束了幾天的研究prim算法來創建最小生成樹。沒有什麼比來自編譯代碼的良好感覺:) – CodeManiak

相關問題