2017-05-04 97 views
1

我怎麼能在C++做一個表像這樣用向量:C++多維向量

int** ary = new int*[2]; 
for (int i = 0; i < size; ++i) 
    ary[i] = new int[size]; 

// fill the array 
for (int i = 0; i < size; i++) { 
    ary[i][0] = ascii_values[i]; 

} 
for (int i = 0; i < size; i++) { 
    ary[i][1] = ascii_chars[i]; 

} 

我怎樣才能做到這一點有:

65 A 
66 B 
67 C 

我有一個動態二維數組,這樣做的向量? 我正在考慮在第三個向量中放入兩個向量,但我不知道這是否可能。 P.s.一切必須是動態的,因爲我會從文件 導入數據請幫助:)

+4

它實際上並不是真正多維的,而是'INT,char'對的列表。因此,最自然的將是一個'std :: vector >' – user463035818

+0

我有單獨的向量中的字符和整數。 矢量 ascii_values和矢量 ascii_chars 如何將它們添加到第三個? – MarkoMlakar

+0

第三個是什麼?給我一秒我會寫一個答案... – user463035818

回答

2

使用向量std::pair可以輕鬆實現上述行爲。見demo

#include <utility> 
#include <vector> 
#include <algorithm> 
#include <iostream> 

int main() { 
std::vector<std::pair<int,char>> result; 
std::vector<int> ascii_vals {65, 66, 67}; 
std::vector<char> ascii_chars {'a', 'b', 'c'}; 

auto ItA = ascii_vals.begin(); 
auto ItB = ascii_chars.begin(); 

while(ItA != ascii_vals.end() && ItB != ascii_chars.end()) 
{ 
    result.push_back(std::make_pair(*ItA,*ItB)); 

    if(ItA != ascii_vals.end()) 
    { 
     ++ItA; 
    } 
    if(ItB != ascii_chars.end()) 
    { 
     ++ItB; 
    } 
} 

for(std::vector<std::pair<int, char> >::iterator it = result.begin(); it != result.end(); it++) 
    std::cout << "(" << it->first << ", " << it->second << ")" << std::endl; 

return 0; 
} 

上面的代碼將打印:

(65, a) 
(66, b) 
(67, c) 
+0

你的狀況在一段時間看起來不正確 – user463035818

+0

@ tobi303怎麼樣?這是一次迭代兩個容器的標準方法之一,如果這是標準方式,那麼我不需要使用Boost – ifma

+0

的zip實用程序,那麼我學到了一些東西。但是,我發現重複使用較小容器的最後一個元素有點奇怪。不知道,但我想我不會喜歡它的代碼導致相同的輸出(1,2,3,4),(1,2)和(1,2,3,4),(1,2,2 ,2) – user463035818

2

你的數據其實並不是真正的多維,而是int, char雙列表。因此最自然的將是一個std::vector<std::pair<int,char>>。恕我直言,只要你能說出一對,你應該這樣做,即會

struct Foo { // I cannot, but you can choose better names 
    int x; 
    char y; 
}; 

,並通過

std::vector<Foo> f; 

對於如何使用矢量我是指你的巨量創建矢量您可以在網上找到的材料。

但是,如果你已經擁有你的數據在兩個向量,因爲你在留言中提到,那麼最簡單的可能是使用一些

struct Bar { 
    std::vector<char> x; 
    std::vector<int> y; 
}; 

可能包含相同的數據,但取決於你如何需要處理的數據可能與std::vector<Foo>相比效率更高或更低(您是否需要獨立訪問字符和整數,或者始終以那些對的形式訪問?)。

+0

總是和那些對一樣:) – MarkoMlakar

+0

@MarkoMlakar正如我寫的,如果你可以命名它,那麼不要使用'std :: pair'。如果我沒有記錯的話,我聽到斯科特邁爾斯曾經給出過這樣的建議,對我而言,這完全有道理。一旦你選擇了更好的名字,那麼'Foo'好得多,然後'pair'和'x' /'y'比'first' /'second'好。 – user463035818

+0

@MarkoMlakar哈哈我只是在閱讀我的ansewr後才理解你的評論。 。然後去'std :: vector ' – user463035818