Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在迭代时声明对象_C++_Struct_Iteration - Fatal编程技术网

C++ 如何在迭代时声明对象

C++ 如何在迭代时声明对象,c++,struct,iteration,C++,Struct,Iteration,很抱歉,我问了一个看起来很平淡的问题,但我已经研究这个话题好几天了,找不到答案。假设我有一个文件,其中包含与用户信息相关联的行,例如: Roberts John 25 Peters Kelly 22 我想将每一行存储为一个对象(结构),然后将指向这些对象的指针存储在一个向量中,而不知道需要多少行。我所知道的创建对象的符号(假设结构称为User,向量称为Users)是 与其说“创建一个名为“roberts”的对象并给它这些值”,我怎么说“创建一个对象并给它这些值” 我知道对于我的示例,我没有使用

很抱歉,我问了一个看起来很平淡的问题,但我已经研究这个话题好几天了,找不到答案。假设我有一个文件,其中包含与用户信息相关联的行,例如:

Roberts John 25
Peters Kelly 22
我想将每一行存储为一个对象(结构),然后将指向这些对象的指针存储在一个向量中,而不知道需要多少行。我所知道的创建对象的符号(假设结构称为User,向量称为Users)是

与其说“创建一个名为“roberts”的对象并给它这些值”,我怎么说“创建一个对象并给它这些值”

我知道对于我的示例,我没有使用结构的真正理由,但我的实际目的更复杂,因此我只提供了一个简单的示例来说明问题。

vector Users;//保存对象而不是指针。
vector<User> Users; // Save the object not the pointer.
for(int i = 1; i < 10; i++)
{
    User user;
    user.age = i;
    Users.push_back(user); // A clone of user will be pushed into the vector.
}
对于(int i=1;i<10;i++) { 用户; user.age=i; Users.push_back(user);//将用户的克隆推送到向量中。 }
您根本不应该使用指针。只需使用对象向量即可:

struct User
{
    std::string first_name;
    std::string last_name;
    int age;
};

int main()
{
    std::vector<User> users;
    std::ifstream ifs("YourFile.txt");
    User user;
    while (ifs >> user.first_name &&
           ifs >> user.last_name &&
           ifs >> user.name) {
        users.push_back(std::move(user));
    }
}
struct用户
{
std::string first_name;
std::字符串last_name;
智力年龄;
};
int main()
{
std::矢量用户;
std::ifstream ifs(“YourFile.txt”);
用户;
while(ifs>>user.first_name&&
ifs>>user.last_name&&
ifs>>用户名){
用户。推回(标准::移动(用户));
}
}
如果您真的非常想使用指针,您需要在空闲存储上分配对象,以便指向它的指针在超出范围后保持有效:

struct User
{
    std::string first_name;
    std::string last_name;
    int age;
};

int main()
{
    std::vector<std::unique_ptr<User>> users;
    std::ifstream ifs("YourFile.txt");
    std::string line;
    while (std::getline(ifs, line)) {
        std::unique_ptr<User> user = std::make_unique<User>();
        std::istringstream iss(line);
        iss >> user->first_name;
        iss >> user->last_name;
        iss >> user->age;
        users.push_back(std::move(user));
    }
}
struct用户
{
std::string first_name;
std::字符串last_name;
智力年龄;
};
int main()
{
std::矢量用户;
std::ifstream ifs(“YourFile.txt”);
std::字符串行;
while(std::getline(ifs,line)){
std::unique_ptr user=std::make_unique();
标准::istringstream iss(线);
iss>>用户->名字;
iss>>用户->姓氏;
iss>>用户->年龄;
用户。推回(标准::移动(用户));
}
}

分配到空闲存储区的对象在使用完后必须显式删除。我使用了
std::unique_ptr
来处理该删除操作。如果使用原始指针,则必须确保
delete
每个对象,然后将指向它们的指针所在的向量移出范围。

应该使用o的向量对象而不是指针向量。所有问题都将得到解决。如果在循环中创建对象,它将在下一次迭代时丢失。您正在寻找的过程称为“解析”。基本上,您需要从字符串中提取
用户
信息并使用它们填充实例。顺便说一句:添加地址(
&Roberts
)将本地对象复制到容器会给您带来麻烦。除非有充分的理由,否则请避免使用指针!您是否至少使用了c++11?最好移动内容:
Users。向后推(std::move(user))如果你有
std::move
你也有
emplace_back
并且可以在向量中构造新对象,消除了临时、移动和复制的需要。
struct User
{
    std::string first_name;
    std::string last_name;
    int age;
};

int main()
{
    std::vector<std::unique_ptr<User>> users;
    std::ifstream ifs("YourFile.txt");
    std::string line;
    while (std::getline(ifs, line)) {
        std::unique_ptr<User> user = std::make_unique<User>();
        std::istringstream iss(line);
        iss >> user->first_name;
        iss >> user->last_name;
        iss >> user->age;
        users.push_back(std::move(user));
    }
}