相关疑难解决方法(0)

为什么删除列表的_first_元素会使`.rend()`无效?

使用XCode 4.6在Mac OS X上测试.

此示例代码显示std::list正如我所期望的那样删除工作的最后一个元素:迭代器引用list::end()仍然是"1结束"并且仍然有效,即使删除了最后一个元素.

但第二个例子反驳了我的直觉.删除列表的第一个元素会发生变化list::rend(),我认为这是"从头开始".

我的期望是错的吗?为什么这是错的?为什么通过删除最后一个元素引用"1结束"仍然有效(如果不是?),但.rend()删除前元素后对"1(在开头()前面"的引用变为无效?

void printList( list<int>& os )
{
  for( int& i : os )
    printf( "%d ", i ) ;
  puts("");
}

void testList()
{
  list< int > os ;
  os.push_back( 1 ) ;
  os.push_back( 2 ) ;
  os.push_back( 3 ) ;
  os.push_back( 4 ) ;
  os.push_back( 5 ) ;  

  // Forward iterators:  reference to .end() not invalidated when remove last elt. …
Run Code Online (Sandbox Code Playgroud)

c++ stdlist reverse-iterator

10
推荐指数
1
解决办法
839
查看次数

无法使用end()获取第二个地图字段

我正在创建一个地图,仅用于学习目的,以存储一些键值对.如果我使用begin()函数打印第二个地图字段,我可以打印地图的第二个字段,但是当我尝试使用end()它的最后一个元素相同时,它无法打印第二个字段.以下是我的代码:

#include <iostream>
#include <cstdlib>
#include <map>
#include <string>
#include <stdio.h>


using namespace std;

map<int,std::string> arr;

map<int,std::string>::iterator p;

int main(int argc, char** argv) {

    arr[1] = "Hello";   
    arr[2] = "Hi";   
    arr[3] = "how";   
    arr[4] = "are";
    arr[5] = "you"; 

    p = arr.begin();
    printf("%s\n",p->second.c_str()); 

    p =  arr.end();
    printf("%s\n",p->second.c_str());

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

c++ dictionary stdmap std c++-standard-library

6
推荐指数
2
解决办法
893
查看次数