如何将字符串放入向量中

How to put a string in a vector?

本文关键字:向量 字符串      更新时间:2023-10-16

>我将文件读为字符串。该文件如下所示:

   x        y          z
57.016998 6.841027 -14.977446
53.777576 5.513538 -19.883400
51.014915 3.275565 -26.822357
48.367588 4.105481 -18.890682

我想把这个字符串放到一个向量<3>,xyz。这可能吗?我将不胜感激你的帮助。

这其实很简单:

struct Vector3
{
    float x, y, z;
};
int main()
{
    std::string input = "57.016998 6.841027 -14.977446n";
    std::stringstream ss(input);
    std::vector<Vector3> Vertices; // list of vertices
    Vector3 v;
    ss >> v.x;
    ss >> v.y;
    ss >> v.z;
    Vertices.push_back(v);
    return 0;
};

这应该足以创建一个完全有效的解决方案。然而,稍微注意一下:std::stringstream是一个简单但不是最快的解决方案。

作为奖励,如果您要加载大量顶点,我真的建议您研究字符串标记器,尽管它们对于初学者来说可能有点太多了。使用令牌器,您的结束代码将如下所示:

TokenStr buffer("57.016998 6.841027 -14.977446n"); // custom tokenizer class
while (buffer)
{
    Vector3 v;
    v.x = buffer.nextFloat(); // grab next float, skipping whitespace
    v.y = buffer.nextFloat();
    v.z = buffer.nextFloat();
    Vertices.push_back(v);
}

一些注意事项:

  • 分词器不消耗任何动态内存
  • 分词器非常高效和快速
  • 分词器通常由程序员自定义编写
  • 最好的分词器从不修改源缓冲区
  • C stdlib 有 strtok,但它会修改源缓冲区,因此并不理想

编辑:感谢 Ben Voigt 的提醒,您只需使用 C 标准库即可轻松实现此目的,而无需使用任何自定义的分词器包装器类:

const char* str = "57.016998 6.841027 -14.977446n27.016998 1.841027 -44.977446";
while (*str)
{
    Vector3 v;
    v.x = strtof(str, (char**)&str);
    v.y = strtof(str, (char**)&str);
    v.z = strtof(str, (char**)&str);
    Vertices.push_back(v);
}

将所有字符串从文件读取到向量中:

fstream f;
f.open( "file.txt", std::ios::in);
if (!f) return -1;
vector<string> strings;
std::copy( istream_iterator<string > (f),                 // copy file content
        istream_iterator<string > (), std::back_inserter( strings)); // to vector
f.close();

要读取三个向量:

std::vector<string> x;
std::vector<string> y;
std::vector<string> z;
fstream f;
f.open( "file.txt", std::ios::in);
if (!f) return -1;
std::string line;
while( std::getline( f, line)) {
   std::istringstream is(line);
   x.push_back( *is++);
   y.push_back( *is++);
   z.push_back( *is);
}
f.close();