【问题标题】:Vector values assign向量值分配
【发布时间】:2012-05-08 23:52:55
【问题描述】:

我有这段代码:

    while(fileStream>>help)
    {
        MyVector.push_back(help);
    }

...让我们说文件“fileStream”中只有一句话:今天是晴天。现在当我这样做时:

    for(int i=0;i<MyVector.size();i++)
    {
         printf("%s\n", MyVector[i]);
    }

,结果是“day day day day day”。当然,它不应该是这样的。变量声明如下:

    char *help;
    vector<char*> MyVector;

编辑:我明白答案,谢谢...但是有没有办法将文件中的单词存储在vector&lt;char*&gt; MyVector(就像我一开始想要的那样)。这对我的程序的其余部分来说会很棒。

【问题讨论】:

  • 使用std::vector&lt;char*&gt; 就像试图将一个方形钉穿过一个圆孔,它们就是不适合。

标签: c++ file vector


【解决方案1】:

当您执行fileStream&gt;&gt;help 时,这并没有改变指针的值,而是覆盖了指针指向的字符串的内容。因此,您一遍又一遍地将相同的指针推入向量中。所以向量中的所有指针都指向同一个字符串。由于最后写入该字符串的是单词“day”,所以当您打印出向量的每个元素时,您就会得到这个单词。

改用std::string的向量:

string help;
vector<string> MyVector;

如果如您所说,您必须坚持使用vector&lt;char*&gt;,那么您将不得不为每个元素动态分配一个新字符串。您不能安全地将char*operator&gt;&gt; 一起使用,因为无法告诉它您的字符串中实际有多少空间,所以我将使用std::string 至少作为输入。

std::string help;
vector<char*> MyVector;

while (fileStream>>help) {
    char * p = new char[help.size() + 1];
    strcpy(p, help.c_str());
    MyVector.push_back(p);
}

当然,当你处理完向量后,你不能让它超出范围。您需要在循环中手动删除每个元素。但是,这仍然不是完全安全的,因为您的内存分配可能会引发异常,导致您已经分配并放入向量中的任何字符串泄漏。所以你真的应该把这一切都包装在一个 try 块中,并准备好捕捉std::bad_alloc

这很麻烦。如果你能解释为什么你认为你需要使用vector&lt;char*&gt;,我敢打赌有人会告诉你为什么不需要。

【讨论】:

  • 我明白了,谢谢...但是有没有办法将文件中的单词存储在 vector MyVector 中(就像我一开始想要的那样)。这对我的程序的其余部分来说会很棒。
【解决方案2】:

那是因为你的char * 都指向同一个对象。 help 指针和存储在向量中的指针都指向同一个对象。每次您从流中读取时,它都会修改所有指针指向的内容。将char* 更改为std::string

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多