我遗漏了一个我无法在网上找到的简单参考print_vector函数需要第二个参数(指针向量)。
#include <iostream>
#include <vector>
using namespace std;
void print_vector(ostream& os, vector<int>*);
int main()
{
int b =100;
vector<int>* a = new vector<int>;
for(int z=0; z< a->size() ; z++)
{
a-> at(z)= b;
b++;
}
print_vector(cout, a);
delete a;
return 0;
}
void print_vector(ostream& os, vector<int> a)
{
for(int c =0; c <= a.size(); c++)
{
os << a[c] << endl;
}
}
任何帮助将不胜感激。
答案 0 :(得分:2)
最简单的方法是使用引用,但您可以尝试两种方法:
using namespace std;
void print_vector(ostream& os, const vector<int>& aVec);
void print_vector(ostream& os, const vector<int>* aVec);
int main()
{
int b = 100;
vector<int> a;
for(int z=0; z < b; z++)
a.push_back(z);
print_vector(cout, a);
print_vector(cout, &a);
return 0;
}
void print_vector(ostream& os, const vector<int> &a)
{
for(int c=0; c < a.size(); c++)
os << a[c] << endl;
}
void print_vector(ostream& os, const vector<int> *a)
{
for(int c=0; c < a->size(); c++)
os << (*a)[c] << endl;
}
upd:thx到juanchopanza使用const引用的建议
答案 1 :(得分:1)
首先,您不清楚在此代码段中尝试执行的操作
int b =100;
vector<int>* a = new vector<int>;
for(int z=0; z< a->size() ; z++)
{
a-> at(z)= b;
b++;
}
由于分配的向量为空,因此循环将永远不会迭代。
至于函数,那么你应该交换参数:第一个参数应该引用一个向量。
例如
void print_vector( const std::vector<int> &v, std::ostream &os = std::cout )
{
for ( int x : v ) os << x << std::endl;
}
程序看起来像
#include <iostream>
#include <vector>
void print_vector( const std::vector<int> &v, std::ostream &os = std::cout )
{
for ( int x : v ) os << x << std::endl;
}
int main()
{
const int N = 100;
std::vector<int> v;
v.reserve( N );
for ( int i = 0; i < N; i++ )
{
v.push_back( i );
}
print_vector( v );
return 0;
}
如果确实需要使用指向矢量的指针,那么代码可能看起来像
#include <iostream>
#include <vector>
void print_vector( const std::vector<int> &v, std::ostream &os = std::cout )
{
for ( int x : v ) os << x << std::endl;
}
int main()
{
const int N = 10;
const int INITIAL = 100;
std::vector<int> *v = new std::vector<int>;
v->reserve( N );
for ( int i = 0; i < N; i++ )
{
v->push_back( INITIAL + i );
}
print_vector( *v );
delete v;
return 0;
}
答案 2 :(得分:0)
首先,我们假设您不想更改print_vector
功能签名。如果不想弄清楚你的程序应该完成什么,这应该编译:
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
void print_vector(ostream& os, vector<int>*);
int main()
{
int b =100;
vector<int> a;
for(int z=0; z< a.size() ; z++)
{
a.at(z)= b;
b++;
}
print_vector(cout, &a);
return 0;
}
void print_vector(ostream& os, vector<int>* a)
{
for(size_t c =0; c < a->size(); c++)
os << (*a)[c] << endl;
}
以下是更改:
print_vector
函数接受指针。这意味着该函数需要address-of
现有向量。注意在main()
函数中,向量是一个对象,我所做的就是传递地址(不需要new
)。有关要求指针作为参数的函数的信息,请参阅此答案:Beginner C++ uninitialized local variable
print_vector
功能的循环已从<=
更改为<
。如果没有,你就会走出界限,导致未定义的行为。
在print_vector
中注意,当传递指针时,operator []
需要以不同的方式处理。在应用operator []
之前,指针被取消引用。另一种语法是a->operator[](c)
,但这有点冗长。