如何将字符串放入向量中?

时间:2014-04-03 19:53:04

标签: c++ string vector

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

   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。这可能吗?我很感激你的帮助。

2 个答案:

答案 0 :(得分:3)

这实际上非常简单:

struct Vector3
{
    float x, y, z;
};

int main()
{
    std::string input = "57.016998 6.841027 -14.977446\n";
    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.977446\n"); // 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.977446\n27.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);
}

答案 1 :(得分:0)

要将文件中的所有字符串读入vector:

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();