带有结构的 C++ 向量不起作用?
Posted
技术标签:
【中文标题】带有结构的 C++ 向量不起作用?【英文标题】:C++ vectors with structs not working? 【发布时间】:2012-12-28 19:35:04 【问题描述】:我正在处理一些文件并尝试加载它们。我想用一个向量来存储最终的信息,这样我就可以在全局范围内保存它而无需知道它有多大。这是我的代码,但程序没有完成启动:
std::string one = "v 100.32 12321.232 3232.6542";
struct Face float x, y, z;;
std::vector<struct Face> obj;
char space[3];
sscanf(one.c_str(), "%s %f %f %f", space, &obj[1].x1, &obj[1].y1, &obj[1].z1);
std::cout << obj[1].x1 << std::endl;
【问题讨论】:
您缺少main
和 obj[whatever]
是非法的,因为最初,正如代码所示,向量是空的。
@LuchianGrigore 但是 sscanf 不会在向量中添加一些东西吗?
不,当然不是。您要么需要resize
,使用构造函数给出初始大小,要么使用push_back
。
不。 operator []
仅供访问 - 它永远不会增加 vector
的大小。
@BlueSpud: map
在这方面与vector
的工作方式不同,顺便说一句...map::operator[]
实际上会创建不存在的元素。
【参考方案1】:
默认构造的vector
s 开始为空,即使编译器允许您使用operator []
,这样做也是未定义的行为。
您可以在创建vector
时分配一些空间:
std::vector<struct Face> obj(2); // Allow enough space to access obj[1]
【讨论】:
我可以在声明之后只使用 obj.resize(5) 吗?我发布的不是整个代码,并且向量在调用函数之前不知道它得到了多少。【参考方案2】:如果要写入向量中的元素 1,向量必须有size() >= 2
。在您的示例中,size()
始终为 0。
考虑创建一个临时的Face
,然后将其push_back
-ing 到vector<Face>
。
【讨论】:
【参考方案3】:也许您使用 sscanf 是有充分理由的,但至少我认为您可以使用流将信息加载到结构中是一件好事。
在这种情况下,我建议您使用 istringstream 类,它可以让您从字符串中读取值作为值,并根据需要进行转换。所以,你的代码,我想我可以改成这样:
std::string one = "v 100.32 12321.232 3232.6542";
struct Face float x,y,z;;
std::vector<struct Face>obj;
char space[3];
// As mentioned previously, create a temporal Face variable to load the info
struct Face tmp; // The "struct" maybe can be omited, I prefer to place it.
// Create istringstream, giving it the "one" variable as buffer for read.
istringstream iss ( one );
// Replace this line...
//sscanf(one.c_str(), "%s %f %f %f",space,&obj[1].x1,&obj[1].y1,&obj[1].z1);
// With this:
iss >> space >> tmp.x >> tmp.y >> tmp.z;
// Add the temporal Face into the vector
obj.push_back ( tmp );
// As mentioned above, the first element in a vector is zero, not one
std::cout << obj[0].x1 << std::endl;
在这种情况下,当您需要从字符串加载值时,istingstream 类(您需要包含“sstream”)很有用。
希望我的回答能对你有所帮助。
【讨论】:
以上是关于带有结构的 C++ 向量不起作用?的主要内容,如果未能解决你的问题,请参考以下文章