这是我为响应C++ Primer 中的练习而编写的程序。我不知道为什么它会两次打印 vector 中的最后一个数字。
vector<int>* create_dyn_vec() {
return new vector<int>();
}
void give_value(vector<int>* ivec_ptr, istream& in) {
int i;
while (in) {
in >> i;
ivec_ptr->push_back(i);
}
}
void print(vector<int>* ivec_ptr) {
for (auto& i : *ivec_ptr)
cout << i << " " << endl;
}
int main() {
auto ivec_dyn_ptr=create_dyn_vec();
give_value(ivec_dyn_ptr, cin);
print(ivec_dyn_ptr);
delete ivec_dyn_ptr;
}
最佳答案
对于重复的最后一个数字的直接问题,替换
while (in) {
in >> i;
只是
while( in >> i ) {
原始代码在将数字附加到 vector 之前不检查输入操作是否成功。因此,在文件末尾,输入操作失败的地方,数字不变,并被追加。
在替换代码中,表达式 in >> i
尝试输入操作并生成对流的引用作为其表达式结果。该引用用作 while
条件,当用作条件 时,它会转换为 bool
。该转换由流定义为生成 not in.fail()
,其中 fail
是成员函数,它告诉您此流上的最后一个 i/o 操作是否失败或成功。
提示:除了传递指针,您还可以使用 C++ 引用。
使用更惯用的 C++,此代码将类似于……
void load_from( istream& in, vector<int>& v )
{
int i;
while( in >> i )
{
v.push_back( i );
}
}
void print( vector<int> const& v )
{
for( auto const& i : v )
{
cout << i << endl;
}
}
int main()
{
vector<int> v;
load_from( cin, v );
print( v );
}
请注意,此处没有new
或delete
表达式。使用像 vector
这样的集合类的大部分意义在于它自动化内存管理。在顶部添加手动内存管理反而达不到目的。
免责声明:我没有尝试编译代码。
关于c++ - 关于C++中的动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36121550/