GCC/codeblocks 的 C++ STL 映射编译器问题

标签 c++ stl dictionary

以下代码应该适用于 VS 2008,但我在第 53 行遇到了问题 其中:

portMap_.erase(it);

我正在使用 codeblocks/mingw/gcc 4.xx

#include<iostream>
#include<map>
#include<string>

using namespace std;

//defining a union that is used with newMap_
union uu
{
  char c;
  int i;
} u;

//Lets define two different maps
//The first parameter is key and second value
map<string, int> portMap_;
map<void *, uu> newMap_;

int main()
{
  //first entry in portmap
  portMap_["first"] = 1;

  //example of using the iterator
  map<string, int>::const_iterator it;
  string z = "second";
  it = portMap_.find(z); //not in the map so wont be found
  if(it == portMap_.end())
  {
    portMap_[z] = 22; //add second element
  }

  //Add thrid element directly
  z = "third";
  portMap_[z] = 12345;

  //Add 4th element by insert
  portMap_.insert(pair<string,int>("fourth", 4444));

  //Add 5th element by insert
  portMap_.insert(pair<string,int>("fifth", 5555));


  cout<<"\n** Printing the portmap_ values **"<<endl;
  for(it = portMap_.begin(); it != portMap_.end(); ++it)
    cout<<"Key = "<<it->first<<"   Val = "<<it->second<<endl;

  cout<<"\n** Removing fourth element **"<<endl;
  z = "fourth";
  it = portMap_.find(z);
  portMap_.erase(it);

  cout<<"\n** Printing the portmap_ values **"<<endl;
  for(it = portMap_.begin(); it != portMap_.end(); ++it)
    cout<<"Key = "<<it->first<<"   Val = "<<it->second<<endl;

  //Playing with New Map
  cout<<"\n\nCreating New Map whose key is a void pointer"<<endl;

  uu u_val1, u_val2;
  void *val1, *val2;
  u_val1.i = 70, val1 = &u_val1;
  newMap_[val1]=u_val1;

  val2 = val1;
  map<void *, uu>::const_iterator it_new;
  it_new = newMap_.find(val2);
  if(it_new != newMap_.end())
  {
    u_val2 = it_new->second;
    cout<<"Note that since u_val2 is a union you can print i or c as required"<<endl;
    cout<<"val2 = "<<val2<<"    value.c = "<<u_val2.c<<endl;
    cout<<"val2 = "<<val2<<"    value.i = "<<u_val2.i<<endl;
  }

  return 0;
}

这里是错误:

map_example\map_example.cpp||In function 'int main()':|
map_example\map_example.cpp|51|error: no matching function for call to 'std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > >::erase(std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> >&)'|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_map.h|566|note: candidates are: void std::map<_Key, _Tp, _Compare, _Alloc>::erase(typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = int, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char,|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_map.h|581|note:                 typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::size_type std::map<_Key, _Tp, _Compare, _Alloc>::erase(const _Key&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = int, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_stri|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_map.h|596|note:                 void std::map<_Key, _Tp, _Compare, _Alloc>::erase(typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator, typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator) [with _Key = std::basic_string<char, std::char_traits<char>, std::all|
||=== Build finished: 1 errors, 0 warnings ===|

最佳答案

您的迭代器定义为常量。尝试一个非常量迭代器。

您也可以通过简单地使用 key_type 来删除一个元素。在您的示例中,它将是:

portMap_.erase(z);

关于GCC/codeblocks 的 C++ STL 映射编译器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6779874/

相关文章:

c++ - get() 的异常行为(从 C++ 中的文件读取)

c++ - 将 N 项插入空 std::map 的复杂性

c++ - 如何使用 STL::map 作为二维数组

python - 使用 Python 读取文本文件并分类到字典中时遇到问题

c++ - shared_ptr 的 unordered_set 找不到它存储的等效对象

c++ - 在后台执行功能?我需要为此线程吗? C++

c++ - 如何调用对象的成员函数作为 std 算法的 unary_function?

python - 在Python中的嵌套字典中存储目录结构

c++ - 通过迭代器为映射成员赋值

c++ - 在不带 BOM 编码的 UCS-2 LE 中使用标准 ofstream 编写 C++ 文件