2017-05-04 64 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