C++ 如何访问结构向量的元素

C++ 如何访问结构向量的元素,c++,C++,我正在做这个简单的练习,我需要创建一个图书列表,然后删除或添加它们。。。 问题是,由于某种原因,我无法访问我创建的结构。 PD:我试过使用数组,效果很好,但我需要动态内存,因为我不知道他们可能想在列表中放多少本书。 我很傻,所以如果这听起来很愚蠢,请原谅我 #include <iostream> #include <string> #include <vector> using namespace std; struct book{ string na

我正在做这个简单的练习,我需要创建一个图书列表,然后删除或添加它们。。。 问题是,由于某种原因,我无法访问我创建的结构。 PD:我试过使用数组,效果很好,但我需要动态内存,因为我不知道他们可能想在列表中放多少本书。 我很傻,所以如果这听起来很愚蠢,请原谅我

#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct book{
    string name;
    string autor;
    string type;
};

void addbook(vector<book> x){
    x.push_back(book());
    cout<<"the name of the book"<<endl;
    cin>>x.back().name;
    cout<<"the name of the autor"<<endl;
    cin>>x.back().autor;
    cout<<"the type of the book"<<endl;
    cin>>x.back().type;
}
int main() {;
    vector<book> list;
    addbook(list);
    cout<<list[0].name;
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
结构书{
字符串名;
字符串自动读取器;
字符串类型;
};
void addbook(向量x){
x、 向后推(书());

cout您有一个全局的
lista
和另一个本地的
main
LibroALeer()
正在使用全局的,
main
正在使用本地的。如果您去掉了本地的,事情应该会好起来。

避免使用全局变量。您在LibroALeer()中遍历了多次,可以这样改进:

//vector<libro> lista;  //Avoid global variable

void LibroALeer(vector<libro>& lista){
    libro libro1;        
    cout << "Introduzca el nombre del libro"<<endl;
    cin >> libro1.nombre;
    cout << "Introduzca el nombre del autor"<<endl;
    cin >> libro1.autor;
    cout << "Introduzca el nombre del genero del libro"<<endl;
    cin >> libro1.genero;
    lista.push_back(libro1);
}
int main() {
    vector<libro> lista;
    LibroALeer(lista);
    cout<<lista[0].nombre;
    return 0;
}
//向量列表;//避免全局变量
void LibroALeer(向量和列表){
libro libro1;

cout有一个名为'lista'的全局变量,您正在main中为另一个向量使用相同的名称。如果在函数中声明一个与全局变量同名的变量,则局部变量会在函数中隐藏全局变量。因此,main()指的是局部变量,而不是LibroALeer()函数引用的是全局变量。这意味着您正在将值推送到LibroALeer()中的全局向量,并尝试在main()中打印局部变量,而main()中没有任何值

请参阅下面的代码以修复此问题

#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct book{
    string name;
    string autor;
    string type;
};

void addbook(vector<book> &x){
    x.push_back(book());
    cout<<"the name of the book"<<endl;
    cin>>x.back().name;
    cout<<"the name of the autor"<<endl;
    cin>>x.back().autor;
    cout<<"the type of the book"<<endl;
    cin>>x.back().type;
}
int main() {;
    vector<book> list;
    addbook(list);
    cout<<list[0].name;
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
结构书{
字符串名;
字符串自动读取器;
字符串类型;
};
void addbook(矢量和x){
x、 向后推(书());

更好的方法是:将其保存在本地并发送到LibroALeer函数您正在将向量的副本传递给您的函数。您希望传递一个引用:
void addbook(vector&x)
Hi,欢迎来到Stackoverflow。你的问题表达得很好,但如果你的代码是英文的,那就更好了。如果你的问题/例子尽可能简单,人们会更容易阅读/回复/升级投票。=)谢谢你的建议…我已经编辑过了。Hi-很抱歉。我升级投票是因为你把它改成了英文,但actually我应该在我的最后一条评论中说,现在进行更改可能太晚了,因为其他人已经用你的原始代码名称回答了。我之前的评论更多的是为了你以后的帖子。对不起!现在我感觉很糟糕!哈哈。另外,你不应该在原始问题中修复代码中的错误。这会使答案过时并且失效ectively提出了一个全新的问题。错误或任何错误的代码选择可能对将来有类似问题的其他人有用,因此您应该将向量保持为局部和全局。但是,请记住这一点,因为我看到其他人已经编辑了他们的答案。编辑更多是为了清晰,通常应该这样做,以免使任何答案过时,因此通常最好在发布后尽快完成。如果您想知道如果您接受了答案的建议但仍然存在问题,该怎么办,请尝试留下评论,解释您尝试了什么以及您遇到的问题。有时您需要显示您的代码,以及是否有更多问题与一行或两行代码相比,通过附加问题来编辑原始问题可能更合适(用户通常在附加编辑的开头编写编辑,以便其他用户知道)。我同意局部变量更好,但您的代码更有效吗?
std::list::back()
具有恒定的时间复杂度。此外,编译器可能会对原始版本进行优化,以生成
emplace\u back()
,因此不复制结构,但您的版本会使编译器更难推断不需要复制。谢谢,但我更改了它,问题似乎是一样的…请参阅我编写的编辑代码。Thaaaaanks!问题是“&”当我需要或不需要填写地址和pointers@clementearanguiz字体很高兴它帮助了你。
void addbook(vector<book> x) // pass by value
void addbook(vector<book> &x) // pass by reference