如何声明类的vector(类似结构体数组)并获取其大小?
问题解答:类对象的vector声明、大小获取及文件追加写入
当然可行,你的代码核心问题出在vector的声明和使用逻辑上,下面一步步给你修正并解释:
核心错误点修正
错误的vector声明:你写的
vector<test> gymMember[10];是10个独立的空vector组成的数组,完全不是你想要的“存储test类对象的动态数组”。正确的声明应该是:vector<test> gymMember;错误的元素添加方式:空vector中没有任何对象,直接用
gymMember[0].name这种下标访问会触发越界错误。需要用push_back或emplace_back向vector中添加对象:// 用push_back添加初始化好的对象 gymMember.push_back({"Lukas", "Naruto", "0123", "22A"}); // 用emplace_back直接在vector内存中构造对象(更高效) gymMember.emplace_back("Jack", "Eren", "0589", "23A");错误的大小获取方式:
size(gymMember)在这里获取的是数组的长度(10),不是vector中元素的数量。要获取vector的元素个数,应该用gymMember.size(),返回值类型为size_t(无符号整数),可以用auto自动推导类型:auto memberCount = gymMember.size();拼写错误:代码中
gymMember[size].adress是笔误,正确拼写为address。
完整修正代码
#include <fstream> #include <string> #include <vector> using namespace std; class test { public: string name; string nickName; string phoneNumber; string address; }; // 正确声明:存储test对象的vector vector<test> gymMember; int main() { // 向vector中添加成员对象 gymMember.push_back({"Lukas", "Naruto", "0123", "22A"}); gymMember.emplace_back("Jack", "Eren", "0589", "23A"); // 先判断vector不为空,避免访问越界 if (!gymMember.empty()) { ofstream output_file("Contact.txt", ios::app); if (output_file.is_open()) { // 获取最后一个元素,用引用避免拷贝 const test& lastMember = gymMember.back(); // 写入文件 output_file << lastMember.name << " " << lastMember.nickName << " " << lastMember.phoneNumber << " " << lastMember.address << endl; } output_file.close(); } return 0; }
额外注意事项
- 访问vector的最后一个元素时,一定要先判断
!gymMember.empty(),否则空vector调用back()或[]会导致未定义行为。 emplace_back比push_back更高效,因为它直接在vector的内存空间中构造对象,不需要额外的拷贝操作。ofstream对象在生命周期结束时会自动关闭文件,所以手动调用close()不是必须的,但显式写出也没问题。
内容的提问来源于stack exchange,提问作者Yato
相关产品推荐
相关产品推荐

