2013-03-15 75 views
-3

我是C++的新手,我制作了一个读取矢量元素和打印元素的函数的函数。问题是打印功能不能正常工作。在C++中打印矢量

#include <iostream> 
    using namespace std; 

1)

int read() 
{ 
    int elements,i; 
    cout<<"Give the number of elements:"; 
    cin>>elements; 
    int v[elements]; 
    for(i=1;i<=elements;i++) 
    { 
     cout<<"v["<<i<<"]="; 
     cin>>v[i]; 
    } 
    return elements; 
} 

2)

void print_vector(int elements) 
{ 
    int i; 
    int v[elements]; 
    for(i=1;i<=elements;i++) 
    { 
     cout<<v[i]; 
    } 
} 

int main() 
{ 
    int n=read(); 
    print_vector(n); 
    return 0; 
} 

Example: 
Give the number of elements:5 
v[1]=1 
v[2]=2 
v[3]=3 
v[4]=4 
v[5]=5 
1348 

它打印1348,而不是12345。什么是错的功能以及如何修改它打印正确的要素是什么?

+3

您的代码使用的是编译器扩展。使用'std :: vector'来代替那个可变长度的数组。 – chris 2013-03-15 20:49:00

+3

请阅读[whathaveyoutried.com](http://whathaveyoutried.com)并遵循建议。 – djechlin 2013-03-15 20:49:01

回答

2

你有错误,在你的打印功能

for(i=1;i<=elements;i++) 
{     //^^^^^ 
    cout<<v[i]; 
    ++i; //You would like to skip some elements? 
} 

您递增索引i两次,数组索引从0开始,而不是1;它以数字(元素-1)而非元素结尾,与此同时,您使用的是数组,而不是矢量。

3
int v[elements]; 

这创建了一个新的整数数组。

在数组中传递是相对困难的,因为您必须小心如何处理内存分配,并且他们回到过去的C

当您在学习C++时,您可以使用class来管理内存问题。 std::vector在语法上与数组相似,但是会为您分配和调整大小,并且还记得它的大小。

您可以通过引用&将对象传递到函数中,并且在函数内部它将能够修改传入的对象,并在函数完成后具有持久效果。

void read(vector<int>& elements) { 
    // in here you can resize the vector 
} 

void print(const vector<int>& elements) { 
    // passing in elements by const reference means you can't modify it 
} 

这么干脆:

int main() { 
    vector<int> elements; 
    read(elements); 
    print(elements); 
} 

另外,如果你想成为面向对象的,你应该寻找分组数据和功能结合在一起的方式,让你避免将围绕数据完全。在这种情况下,您可以将矢量和读取和打印功能分组。也许叫它UserIntegers

class UserIntegers { 
public: 
    void process() { 
     read(); 
     print(); 
    } 
private: 
    vector<int> numbers; 
}; 

用法:

int main() { 
    UserIntegers userIntegers; 
    userIntegers.process(); 
} 
+0

我应该如何设计打印功能,使其不会创建新的整数数组? – 2013-03-15 20:55:03

2

read(),你读的元素融入本地阵列v。当函数结束时,数组也将消失。 print_vector()也是如此。

另一个错误是你的数组索引。您可以访问从1elements(含)的元素,这会忽略第一个元素0并最终访问数组边界之外的一个元素(elements)。

您需要在两个函数之外分配一个数组,最好是std::vector,并将其传递到read()进行填充,并将其传递到print_vector()进行打印。

#include <iostream> 
#include <vector> 

void read(std::vector<int> &v) 
{ 
    int elements,i, n; 
    std::cout<<"Give the number of elements:"; 
    std::cin>>elements; 
    for(i = 0; i < elements; i++) 
    { 
     std::cout<<"v["<<i<<"]="; 
     std::cin>> n; 
     v.push_back(n); 
    } 
} 

void print_vector(const std::vector<int> &v) 
{ 
    for(auto i = v.begin(); i != v.end(); ++i) 
    { 
     std::cout << *i; 
    } 
} 

int main() 
{ 
    std::vector<int> v; 
    read(v); 
    print_vector(v); 
    return 0; 
} 
+0

我想你是缺少std :: vector – 2013-03-15 21:49:21

+0

@JorgeNúñez的模板参数谢谢你,我错过了。固定。 – 2013-03-15 21:52:19