首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

容器指针的自增解决办法

2012-04-02 
容器指针的自增...vectorstring* pstrvectorstring*::iterator iter pstr.begin()while(iter ! p

容器指针的自增
...
vector<string*> pstr;
vector<string*>::iterator iter = pstr.begin();
while(iter != pstr.end())
{
  cout << **iter << "---" << (**iter++).size() <<endl;
}
这个代码段有错误 而且就是 (**iter++).size()这里 
用(*iter++)->size();也不行 

如果用(**iter).size();再加上一句 ++iter; 就能正确执行
但是这是为什么呢?


[解决办法]
因为cout << **iter << "---" << (**iter++).size() <<endl;
**iter和**iter++的运算顺序是不一致的。如果说iter++这个先运算。那么当iter++达到了end()时候 前面的**iter 就会运行崩溃。
[解决办法]
cout << **iter << "---" << (**iter++).size() <<endl;
///这是未定义行为.

因为 **iter 和 (**iter++).size()的执行顺序是不确定的.

所以当后者先执行时,那么在最后,iter 会指向 vector 的最后一个元素,那么前者再对iter 进行 * 操作,导致另一个未定义行为.
[解决办法]

为了不丢丑,仔细研究了下

主要问题是出在对于下面这段语句的计算顺序上
cout << **iter << /*"---" << */(**iter++).size() <<endl;
等价于
<<是操作符重载 也就等价于cout.operetor<<(**iter).operator<<((**iter++).size()).operator<<(endl);

C++执行时的入栈顺序是(**iter++).size()然后是(**iter),即第一个参数**iter入栈时此时iter的值已经进行了自加,所以iter此时可能是指向vector中end处,所以会发生错误

但此时在(**iter++).size()处所执行滴iter的值依旧是iter未自加前得副本,

附上测试代码

C/C++ code
    vector<const char **> pstrVec;    const char *a[] = {        "adas",        "asdasd",        "asdasdasdas"    };    const char **p = a;    pstrVec.push_back(a);    pstrVec.push_back(a+1);    vector<const char **>::iterator iter = pstrVec.begin();    while( iter != pstrVec.end() )    {        cout << **iter << strlen(**iter++) << endl;//此时这里运行时会报错结果是asdasd 4    } 

热点排行