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

C++ 如何将字符串放入向量中?,c++,string,vector,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 TokenStr buffer("57.016998 6.841027 -14.977446\n"); // custom tokenizer class wh

我把一个文件读成一个字符串。该文件如下所示:

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

我想把这个字符串放到一个向量xyz上。这可能吗?非常感谢您的帮助。

要将文件中的所有字符串读入矢量,请执行以下操作:

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

这其实很简单:

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;
};
请注意:

标记器不消耗任何动态内存 标记化器非常高效和快速 标记器通常由程序员自定义编写 最好的标记器从不修改源缓冲区 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);
}

向量应包含字符串中的x值。向量y,向量z。一个有3个值x,y,z的结构怎么样?因为你有多行,所以有一个这些结构的向量。在继续之前,你读这些值的目的是什么?如果要将每一行作为一个实体进行处理,那么使用三个单独的向量并不是最好的方法。我建议的,你没有回应的是,用一个包含x、y和z的结构,然后用该结构的一个向量。@HellMan-好吧,把它们作为单独的向量处理不是一种方法,因为那样会变得太混乱。请看下面的答案。@Hell Man-区别在于您将一行视为一个实体,而不是处理和维护三个独立且不相交的实体。如果你在x坐标上排序呢?你现在必须编写代码,不仅要在x坐标上排序,还要确保你把y和z带到一起,如果你把它们分成3个独立的向量。另外,想象一下,如果您想让其他属性与坐标关联,比如字符串标签?您现在将有四个向量吗?如果您决定制作一个标记器,标准库函数std::strtol是您需要的90%。谢谢您的结构。@BenVoigt是的,您是正确的:C stdlib strtof/strtol和strpbrk足以实现这样一个类,只需付出很少的努力。说得好@Jorma:当空格分隔时,正如这些值一样,不需要strpbrk。如何在向量中有多个对象?因为我的文件很大,就像我在上面的问题中展示的那样,我需要制作很多对象,因此我不会使用太多的内存。