在 C++ 中填充二维向量
Posted
技术标签:
【中文标题】在 C++ 中填充二维向量【英文标题】:Fill 2D vector in C++ 【发布时间】:2017-12-04 18:10:59 【问题描述】:我正在尝试用字符填充 C++ 中的二维向量,但是当我运行此代码时,它以一行字符结尾 (*..
)。
我怎样才能像这样填充二维向量:
*.*
.**
#include <iostream>
#include <vector>
int main()
std::vector<std::vector<char> > vec2D;
std::vector<char> rowV;
unsigned int row=2;
unsigned int col=3;
char c;
unsigned int temp=0;
while(temp!=col)
while(rowV.size()!=row)
std::cin>>c;
rowV.push_back(c);
vec2D.push_back(rowV);
++temp;
return 0;
【问题讨论】:
有趣且无关紧要的趣事:std::vector<std::vector<char> >
不会生成 2D 矢量。它产生了vector
s 的vector
,这带来了一些令人讨厌的性能问题(搜索词:“pointer Chasing”、“spatial locality”)。从vector
s 的vector
开始,因为它非常容易理解和使用,但是如果分析发现程序太慢,请记住它。
【参考方案1】:
每次插入后都要清除rowV
,否则会被填满,不会再添加其他字符。此外,row
应与 col
交换,反之亦然,否则您将获得 3x2(而不是 2x3)2D 矢量。
while(temp!=row)
while(rowV.size()!=col)
std::cin>>c;
rowV.push_back(c);
vec2D.push_back(rowV);
rowV.clear(); // clear after inserting
++temp;
【讨论】:
另一种选择是将std::vector<char> rowV;
的定义移动到while(temp!=row)
。这可能会慢一些(程序可能会重复构造一个销毁rowV
),但它可以更好地限定rowV
,并帮助读者将rowV
绑定到它是什么以及它打算如何使用。在您有充分的理由偏爱速度之前,可读性应该胜过速度。
@user4581301 是的,两种方法都有效。【参考方案2】:
了解 [用空的 1D 矢量推回 2DVector] 是什么样子会有所帮助。 请参阅下面的示例。
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
//-v-----A FUNCTION TO PRINT 2D VECTORS
template<typename T> //We don't know what type the elements are yet, so we use a template
void printVec2D(vector<vector<T>> a) // a is the name of our input 2Dvector of type (T)
for (int i = 0; i < a.size(); i++) // a.size() will equal the number of rows (i suppose rows/columns can depend on how you look at it)
for (int j = 0; j < a[i].size(); j++) // a[i].size() is the size of the i'th row (which equals the number of columns, foro a square array)
std::cout << a[i][j] << "\t";
std::cout << "\n";
return;
//-^--------
int main()
int X = 3; int Y = 3;
int VectorAsArray[3][3] = 1,2,3,
14,15,16,
107,108,109;
vector<vector<int>> T;
for (int i = 0; i < X; i++)
T.push_back();// We insert a blank row until there are X rows
for (int j = 0; j < Y; j++)
T[i].push_back(VectorAsArray[i][j]); //Within the j'th row, we insert the element corresponding to the i'th column
printVec2D(T);
//system("pause"); //<- I know that this command works on Windows, but unsure otherwise( it is just a way to pause the program)
return 0;
【讨论】:
以上是关于在 C++ 中填充二维向量的主要内容,如果未能解决你的问题,请参考以下文章