实现向量的向量
Posted
技术标签:
【中文标题】实现向量的向量【英文标题】:implementing Vector of vectors 【发布时间】:2015-09-07 21:31:48 【问题描述】:我实际上是在向量的向量上进行操作。但是我如何增加行和列指针(这里指针表示迭代器) 我的代码是这样的
bool searchMatrix(vector<vector<int>>& matrix, int target)
vector< vector<int> >::iterator row=matrix.begin();
vector<int>::iterator col=row->begin();
while(row!=matrix.end()&&col!=row->end())
if(*col==target)
return true;
else
if(*(col)+1<=target)
++col;
else
++row;
return false;
【问题讨论】:
你想达到什么目的?你的问题是什么? 事实上,这是一个非常奇怪的搜索。您应该说明您要解决的问题。 【参考方案1】:如果您需要搜索整个矩阵,您需要有 2 个循环:行的外部循环和列的内部循环 - 这看起来更明显。
bool searchMatrix(vector<vector<int>>& matrix, int target)
for (vector< vector<int> >::iterator row=matrix.begin(); row != matrix.end(); ++row)
for (vector<int>::iterator col=row->begin(); col != col.end(); ++col)
if(*col==target)
return true;
return false;
...但是当所有行的长度不同时,这种方法会更好。如果这是一个矩形矩阵,最好将其全部保存在一个长度为 row * col
的向量中
如果你愿意,你可以为它编写访问器方法(我会带来非模板方法不要过于复杂):
int& getElement(<vector<int>& matrix, size_t matrixWidth, size_t row, size_t col)
// here's no boundary check!!!
return matrix[row * matrixWidth + col];
在这种情况下,您的搜索变得简单:
bool searchMatrix(vector<vector<int>>& matrix, int target)
for (vector<int>::iterator item=matrix.begin(); item != matrix.end(); ++item)
if(*item==target)
return true;
return false;
【讨论】:
【参考方案2】:使用迭代器而不是索引来给出向量中的位置在很大程度上是一种风格选择。如果向量的向量对于您的数据结构(一个单独的问题)是一个不错的选择,并且您想要的算法如图所示,那么您已经达到了您的风格选择的极限,是时候放弃风格并专注于功能了。
更简单的表述:不要使用迭代器,使用索引。
bool searchMatrix(vector<vector<int>>& matrix, int target)
std::size_t row=0;
std::size_t col=0;
while(row!=matrix.size()&&col<matrix[row].size())
if(matrix[row][col]==target)
return true;
else
if(matrix[row][col]+1<=target)
++col;
else
++row;
return false;
【讨论】:
以上是关于实现向量的向量的主要内容,如果未能解决你的问题,请参考以下文章