打印二维矢量指针
printing a 2d vector pointer
我像这样创建了一个二维向量:
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>')
我很困惑,因为我从向量而不是向量本身向它传递了一个整数?
这是因为你传递了一个指向函数的指针:
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);
I am confused as I am passing it an int
from a vector and not the vector itself?
不,你不是。如果您的程序已编译,您实际上会有未定义的行为。
因为 my_vector
是一个指向 std::vector<std::vector<int>>
的指针,这个 my_vector[i][j]
的计算结果是数组 ith 2d vector 12=],返回第 ith 个二维向量中的第 j 个向量。
您需要先取消引用 my_vector
:
std::cout << (*my_vector)[i][j];
如果你有一个指向像这样的二维向量的指针
std::vector<std::vector<int> > *my_vector;
然后取消引用指针 *my_vector
您将获得原始向量本身。
因此表达式 ( *my_vector )[i] 给出外向量的第 i 个元素,表达式 ( *my_vector )[i][j] 给出外向量的第 j 个元素第 i 个内向量。
因此循环看起来像
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;
}
使用此函数,您可以将矢量写入文件中。
我像这样创建了一个二维向量:
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>')
我很困惑,因为我从向量而不是向量本身向它传递了一个整数?
这是因为你传递了一个指向函数的指针:
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);
I am confused as I am passing it an
int
from a vector and not the vector itself?
不,你不是。如果您的程序已编译,您实际上会有未定义的行为。
因为 my_vector
是一个指向 std::vector<std::vector<int>>
的指针,这个 my_vector[i][j]
的计算结果是数组 ith 2d vector 12=],返回第 ith 个二维向量中的第 j 个向量。
您需要先取消引用 my_vector
:
std::cout << (*my_vector)[i][j];
如果你有一个指向像这样的二维向量的指针
std::vector<std::vector<int> > *my_vector;
然后取消引用指针 *my_vector
您将获得原始向量本身。
因此表达式 ( *my_vector )[i] 给出外向量的第 i 个元素,表达式 ( *my_vector )[i][j] 给出外向量的第 j 个元素第 i 个内向量。
因此循环看起来像
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;
}
使用此函数,您可以将矢量写入文件中。