2015-01-10 81 views
-2

我有一個任務是從現在開始的一週左右。它是關於在源文件所在的目錄中創建文本文件的字母計數器(個案無關緊要)。然後,字母的輸出應該首先根據出現次數最多的字母,其次,如果出現的字母數量相同,則按照字母順序進行排序。作業頁面在這裏:http://www.cs.sfu.ca/CourseCentral/135/tjd/a1.html。我已經做了一個具有相同輸出的程序(這裏是:https://drive.google.com/file/d/0BxuBN4fpoq5LNHIwR2U2elVkdVE/view?usp=sharing)。就像你在賦值頁面中看到的一樣,我的proffisor堅持使用一個向量,Freq_table,它具有指向結構char_count的指針。我試圖做簡單的代碼,添加元素的載體,就像這樣:如何在C++中使用指向一個結構的向量?

#include <iostream> 
#include <string> 
#include <fstream> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
#include <vector> 

using namespace std; 

struct char_count { 
    char c; 
    int count; 
}; 

typedef vector<char_count*> Freq_table; 

int main() { 
    char_count A_count = {'A', 0}; 
    Freq_table.push_back (A_count); 
} 

但是編譯器總是給出了這樣的消息:

error: expected unqualified-id before '.' token          
Freq_table.push_back (A_count); 

我似乎無法來解決這個錯誤。我現在需要的只是知道向具有指向結構的向量添加元素的語法。

問候。

+1

首先找出如何實例化一個向量。 – juanchopanza

+3

您應該向部門負責人抱怨說您的教師完全無法使用C++編程。這個任務是合理的,「我們正在學習操作符new和delete,以及爲什麼聰明的指針被髮明,因爲手工操作是非常棘手的」。對於「我們通過解決一個簡單的問題來刷新C++」這絕對是**可怕的**。非常糟糕,專業的C++程序員不會認爲它已經解決了任何問題,只創建了200個新問題。 –

回答

0

你在做什麼是錯的,你正在做的事情一樣

int.push_back(A_count); 

而且,你告訴你的載體要存儲一個指針到char_count -variable,但你存儲變量本身,因此導致另一個錯誤。 在將值推入矢量之前,必須先聲明它。一個可能的(未經測試)的解決辦法是

Freq_table newTable; 
newTable.push_back(&A_count); 
+0

這是一種工作。非常感謝。 –

0

您已經聲明Freq_table作爲一個類型,而不是一個實例,因此改變:

typedef vector<char_count*> Freq_table; 

到:

vector<char_count*> Freq_table; 

爲了增加該表,你必須傳遞一個char_count實例的地址。一種方法是:

char_count* A_count = new char_count; // allocate a new instance...returns the address. 
A_count->c = 'A'; 
A_count->count = 0; 
Freq_table.push_back(A_count); 

不要忘記,你將有如果與new分配刪除的情況下,在載體或你將有內存泄漏。

0

該分配的唯一兌換部分是您實際上並不需要使用動態內存。您可以使用指針矢量,僅用於合理合理的目的,即按字母順序降序排列。

向量中的指針將是非擁有指針。對於非擁有指針使用原始指針是合適的,因爲這不會導致內存泄漏。

事情是這樣的:

int main(void) 
{ 
    char_count dictionary_order[26]; 
    for(int i = 0; i < 26; ++i) dictionary_order[i] = {'A'+i, 0}; 

    /* read the input, count letters. 
     Notice that the matching letter is always at index ch-'A' */ 


    Freq_table frequency_order; 
    for (auto& item : dictionary_order) frequency_order.push_back(&item); 

    sort(frequency_count.begin(), 
     frequency_count.end(), 
     [](char_count* a, char_count* b) -> bool 
     { 
      return (a->count == b->count)? (a->c < b->c) : (a->count > b->count); 
     } 
     ); 

    /* print them out */ 
} 

沒有動態分配,因此沒有泄漏。而且由於C++以相反的聲明順序銷燬局部變量,所指向的對象將比指針自身存在的時間更長。

如果您需要容納可變數量的項目,則可以使用管理內存的vector<char_count>,並將指針存儲在指定的指針向量中。當然,如果矢量調整大小,那麼指針將變爲無效,因此在開始填充指針矢量之前,您需要構建完整的「真實」矢量。

相關問題