【问题标题】:C++ Multidimensional VectorC++ 多维向量
【发布时间】:2017-10-03 01:42:18
【问题描述】:

如何在 C++ 中使用矢量制作这样的表格:

65  A
66  B
67  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];

}

如何使用矢量来做到这一点? 我正在考虑将两个向量放在第三个向量中,但我不知道这是否可能。 附:一切都必须是动态的,因为我将从文件中导入数据 请帮忙:)

【问题讨论】:

  • 它实际上并不是真正的多维,而是int, char 对的列表。因此,最自然的应该是std::vector&lt;std::pair&lt;int,char&gt;&gt;
  • 我在单独的向量中有字符和整数。 vector ascii_values 和 vector ascii_chars 如何将它们添加到第三个?
  • 第三个是什么?给我一秒钟我会写一个答案...
  • 类似:vector ints , vector chars >>thirdOne
  • @MarkoMlakar tobi303 的建议是准确的。 std::vector&lt;std::pair&lt;int,char&gt;&gt; 是您的问题的 sn-p 似乎试图复制的内容。一个向量是size元素,每个元素是一对值,第一个是int,第二个是char

标签: c++ multidimensional-array vector dynamic


【解决方案1】:

您的数据实际上并不是真正的多维数据,而是int, char 对的列表。因此,最自然的应该是std::vector&lt;std::pair&lt;int,char&gt;&gt;。恕我直言,只要您可以命名一对,就应该这样做,即

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&lt;Foo&gt; 相比,它的效率可能更高或更低(您需要独立访问字符和整数还是始终作为这些对访问? )。

【讨论】:

  • 总是像那些对:)
  • @MarkoMlakar 正如我所写,如果你能说出它的名字,那么不要使用std::pair。如果我没记错的话,我曾经听过 Scott Meyers 给出这个建议,对我来说这完全有道理。一旦你选择了更好的名字,Foopair 好得多,x/yfirst/second 更好
  • @MarkoMlakar haha​​ 我只是在再次阅读我的回答后才理解你的评论......然后去std::vector&lt;Foo&gt;
【解决方案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)

【讨论】:

  • @tobi303 怎么会这样?这是在不使用 Boost 的 zip 实用程序的情况下一次迭代两个容器的标准方法之一
  • 如果这是标准方式,那么我学到了一些东西。但是,我觉得重用较小尺寸的容器的最后一个元素有点奇怪。不确定,但我想我不喜欢代码导致 (1,2,3,4),(1,2) 和 (1,2,3,4),(1,2,2) 的相同输出,2)
  • 啊,我明白了你的担忧,我只是假设两个容器的大小相同,但是是的,也许最好将条件更改为 &&
  • 我找到了this,我的理解是,启动 zip 迭代器也期望容器大小相同(与 std 算法相同),这也是我所期望的
  • 再问一个问题:p 如何通过结果只显示第一个“65 a”?如果它是一个数组,它将具有索引结果 [0] [0]。这是正确的吗?: cout
猜你喜欢
  • 2017-05-10
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多