打印2D矢量指针
printing a 2d vector pointer
我创建了一个2D矢量:
int main(){
std::vector<std::vector<int> > my_2d_Vector;
for(int i = 0; i < 10; ++i){
std::vector<int> internal_vector;
for(int j; j < 10; ++j){
internal_vector.push_back(j);
}
my_2d_vector.push_back(internal_vector);
}
print_2d_vector(&my_2d_vector);
}
我试图像这样打印到屏幕上:
void print_2d_vector(std::vector<std::vector<int> > *my_vector){
for(int i = 0; i < my_vector->size(); ++i){
for(int j = 0; j < my_vector[i].size(); ++j){
std::cout << my_vector[i][j];
}
std::cout << "/n";
}
}
这看起来也不错。但是由于某种原因我不明白,当我尝试编译时,它告诉我这一点:error : no match for 'operator<<' (operand types are std::ostream {aka std::basic_ostream<char>} and 'std::vector<int>')
我很困惑,因为我将其传递给向量而不是向量本身的int?
这是因为您将指针传递到函数:
my_vector[i]
实际上无法访问向量,而是指针。然后第二个 [j]
访问实际向量。您需要首先取消指针以访问向量。
为什么无论如何您甚至都需要指针?如果需要更改向量的函数,则只需通过值还是使用参考:
void print_2d_vector(std::vector<std::vector<int> >& my_vector){
for(int i = 0; i < my_vector->size(); ++i){
for(int j = 0; j < my_vector[i].size(); ++j){
std::cout << my_vector[i][j];
}
std::cout << "/n";
}
}
和:
print_2d_vector(my_2d_vector);
我很困惑,因为我将其传递给向量而不是向量本身的
int
?
不,你不是。如果您的程序编译,您实际上会有不确定的行为。
因为my_vector
是std::vector<std::vector<int>>
的指针,因此此my_vector[i][j]
评估了数组my_vector
中的 i th 2d向量,返回 j th vector中的ITH 2D向量。
您需要先解除my_vector
:
std::cout << (*my_vector)[i][j];
如果您有像这样的2D向量的指针
std::vector<std::vector<int> > *my_vector;
然后删除指针*my_vector
您将获得原始向量本身。
因此,表达式( *my_vector)[i]给出了外矢量的i-the元素,并且表达式( *my_vector)[i] [j]给出了ITH INTER矢量的jth元素。
因此,循环看起来像
void print_2d_vector(std::vector<std::vector<int> > *my_vector){
for(int i = 0; i < my_vector->size(); ++i){
for(int j = 0; j < ( *my_vector )[i].size(); ++j){
std::cout << ( *my_vector )[i][j];
}
std::cout << "/n";
}
}
与
相同void print_2d_vector(std::vector<std::vector<int> > *my_vector){
for(int i = 0; i < my_vector->size(); ++i){
for(int j = 0; j < my_vector->operator []( i ).size(); ++j){
std::cout << my_vector->operator []( i )[j];
}
std::cout << "/n";
}
}
考虑到您可以将函数声明为具有std::vector<std::vector<int> > &
类型的参数。在这种情况下,功能看起来会更简单。例如
std::ostream & print_2d_vector( const std::vector<std::vector<int> > &my_vector,
std::ostream &os = std::cout )
{
for ( size_t i = 0; i < my_vector.size(); ++i )
{
for ( size_t j = 0; j < my_vector[i].size(); ++j )
{
os << my_vector[i][j] << ' ';
}
os << "/n";
}
return os;
}
使用此功能,您可以例如在文件中写入向量。
- 如何引用 2D 指针?
- 使用双指针传递 2D 常量数组
- 使用指针算法修改函数中的 2D 数组
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- 无法分配函数指针的 2D 数组
- 在 Arduino 中为 2D 指针数组赋值
- 删除使用 new 创建的 2D 或 3D 指针
- 如何使用指针C++将元素从2D数组复制到1D数组
- 带有空指针的指针 c++ 的 2D 数组
- 不明白使用双指针 (**) 创建 2d 动态数组
- 将 2D 数组指针传递给 C++ 中的函数
- C++ & Python:传递并返回从 python 到 c++ 的 2D 双指针数组
- 尝试理解指向具有 2d 顶点的指针的指针
- 指向 2D 数组的指针的类型是什么?
- c ++ 2d 数组和指向指针的指针 - 我不明白这段代码
- 有没有办法使用初始化到第一行的指针访问 2d 数组的第二行?
- 如何使用3D char数组调整双指针2D char阵列的大小
- 如何初始化和定义指向指针 2D 数组的指针
- 在mex函数中返回双指针2D矩阵
- 指向作为输入参数的指针(2D数组)的指针