2016-05-13 107 views
0

我一直在嘗試使用指向數組來指向矢量,但是,至今我已經能夠實現這些矢量,但試圖將元素添加到其中一個子向量,我在運行時重複出現未知錯誤。從C++中的指針數組向元素添加元素

我以前定義我的數組作爲這樣:

std::vector<std::string> *frequency_table[10000]; 

我然後嘗試將元素添加到載體中的特定一個。這是導致運行時錯誤的行。

frequency_table[index]->push_back(value); 

任何想法?

+1

你有一個指針數組 - 但沒有證據,你所做的這些指針實際上指向有效的'VECTOR'實例。 'frequency_table'在哪裏以及如何初始化? –

+0

沒有上下文很難分辨,但這聽起來像是有些東西超出了範圍。你可以發佈你的一些代碼嗎? – DJMcMayhem

+0

Igor Tandetnik更可能是正確的,沒有什麼可以擺脫範圍,但這是沒有意義的。這個問題無法在當前狀態下回答。任何人都可以做的最好的事情就是猜測併發揮勝算。更多信息,[最好是MCVE](http://stackoverflow.com/help/mcve),是必需的 – user4581301

回答

3

乍一看,問題看起來像你沒有爲指針分配任何內存,所以無處可去。雖然我不能確定沒有錯誤信息。

如果是這樣的話,但是你需要使用new分配內存

+0

我認爲你是正確的,缺乏初始化是問題。我應該簡單地做 std :: vector * frequency_table [] = new * std :: vector [10000]; – vtleavs

+0

@vtleavs這將是一個語法錯誤。你必須決定是否要有一個向量塊(在這種情況下根本不使用指針),或者是否需要10000個獨立的向量,只有在需要時纔會創建它們(在這種情況下,初始化指針到'nullptr',然後在你第一次使用它時調用'new')。 –

1

你的方法涉及混合向量(和向量是一件好事)和指向對象的C風格數組指針(由於代碼中已經有載體,所以出現混淆)。

如果你想串的載體的10000個載體,然後只寫

std::vector<std::vector<std::string> > frequency_table(10000); 
. . . 
frequency_table[index].push_back(value); 

第一行聲明一個vector,其中的每個元素是vector<string>,分配10000個元素,並初始化每個元素。

+0

您的開場白有點令人誤解。靜態大小的向量數組沒有任何問題。假設你知道你有10000個未知數量的元素列表。這是指向'矢量'的指針,變得很奇怪,這不是C風格的東西。一個有經驗的C程序員和一個經驗豐富的C++程序員一樣可能會去看看這個,「指向列表的指針?呃爲什麼?」 – user4581301

+0

基本上你說我應該使用向量的矢量而不是向量的數組? – vtleavs

+0

@ user4581301:你有一點。我會重新說出這句話,謝謝。 – kkm

0

使用從你們的投入,我意識到,我的問題是載體沒有被初始化,所以我才加入這個循環在循環中,我填充載體,和現在的工作:

for(int i = 0; i < 5000; ++i) 
{ 
    frequency_table[i] = new std::vector<std::string>; 
} 

最終的代碼如下所示:

for(int i = 0; i < 5000; ++i) 
{ 
    frequency_table[i] = new std::vector<std::string>; 
} 

for(auto itr = frequency_map.begin(); itr != frequency_map.end(); ++itr) 
{ 

    std::string key = itr->first; 
    double value = itr->second; 


    frequency_table[(int)value]->push_back(key); 
} 

謝謝大家!

PS我減半10000出於測試目的

+0

如果你總是要創建所有的矢量,那麼使用'vector frequency_table [10000];'並且不要使用指針或新的 –

+0

那麼簡單一點吧,一旦你新建了它們,你需要'刪除「它們,或者你正在泄漏內存。我可以把你的興奮與你聯繫起來,但似乎有更多的問題。小心一點。 – kkm

+0

謝謝你,昨晚我得到了內存泄漏,忘記了刪除是一件事。就創建矢量數組而言,我需要的矢量數量非常多,因爲我將它用作模式識別頻率表,我擔心嵌套結構方法可能會導致內存問題。 – vtleavs