我的std :: string对象指针列表不正常,我无法弄清楚原因

时间:2011-10-02 02:19:37

标签: c++ string list iterator

你能帮我搞清楚这段代码: onWreate(xMsg)由WindowProcedure在WM_NCCREATE消息上调用。问题在于迭代器解除引用。我似乎无法将迭代器设置为列表的begin(),然后获取迭代器的内容,该迭代器应该是一个指向字符串的指针,该字符串可以与MessageBox中的 - > c_str()一起使用。

class MyController
{
public:
    MyController() { }
    ~MyController() { }
    void onCreate(xMessage *msg);

protected:
    std::list<std::string *> m_stringlist;
    std::list<std::string *>::iterator m_stringlistiter;
};

void onCreate(xMessage *msg)
{
    std::string *first_string = new std::string("Hello world");
    m_stringlist.push_back(first_string);
    // This is where my iterator comes into play and it doesn't seem to do the trick.

    m_stringlistiter = m_stringlist.begin();
    MessageBox(NULL, (*m_stringlistiter)->c_str(), "Title", MB_OK);
}

1 个答案:

答案 0 :(得分:0)

我们没有给出完整的示例,但我假设您正在创建和使用迭代器之间进行其他操作。

在容器上进行各种操作后,不保证迭代器有效。你应该保存它们。

我愿意打赌这会有效吗?

class MyController
{
public:
    MyController() : title("Hello World") {}
    void onCreate(xMessage *msg);
    {
         MessageBox(NULL, title.c_str(), "Title", MB_OK);
    }
protected:
    std::string title;  // generic lists of strings with 
                        // magic indexes are hard to maintain.
};

这也更容易阅读和调试,这比软件开发的任何其他部分都要贵很多。

在大多数情况下,您应该使用迭代器作为临时对象。它们很少超出函数/方法的范围。

struct some_struct {

  some_struct() {
    gui_text.push_back( std::string("Hello World!") );
  }
  void some_function() {
    std::list<std::string>::iterator iter = gui_text.begin();
    for (; iter != gui_text.end(); iter++) {
      std::cout << *iter << std::endl;
    }
  }

  std::list<std::string> gui_text;
};

从容器中添加,删除等内容将使迭代器无效。所以只需在每个点重新创建迭代器。字符串和迭代器非常轻量级,因此您无需担心以这种方式进行优化。真。