带有结构的 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;

【问题讨论】:

您缺少 mainobj[whatever] 是非法的,因为最初,正如代码所示,向量是空的。 @LuchianGrigore 但是 sscanf 不会在向量中添加一些东西吗? 不,当然不是。您要么需要resize,使用构造函数给出初始大小,要么使用push_back 不。 operator [] 仅供访问 - 它永远不会增加 vector 的大小。 @BlueSpud: map 在这方面与vector 的工作方式不同,顺便说一句...map::operator[] 实际上会创建不存在的元素。 【参考方案1】:

默认构造的vectors 开始为空,即使编译器允许您使用operator [],这样做也是未定义的行为。

您可以在创建vector 时分配一些空间:

std::vector&lt;struct Face&gt; obj(2); // Allow enough space to access obj[1]

【讨论】:

我可以在声明之后只使用 obj.resize(5) 吗?我发布的不是整个代码,并且向量在调用函数之前不知道它得到了多少。【参考方案2】:

如果要写入向量中的元素 1,向量必须有size() &gt;= 2。在您的示例中,size() 始终为 0。

考虑创建一个临时的Face,然后将其push_back-ing 到vector&lt;Face&gt;

【讨论】:

【参考方案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++ 向量不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

存储在向量中的 C++ std::function 不起作用

C ++排序向量字符串不起作用

在套接字 C++ 中选择不起作用

用于删除 C++ 中的注释的程序不起作用

从向量到空指针的memcpy(反之亦然)不起作用

C++ MFC SDI 复制/粘贴不起作用