c++ map使用问题和迭代器问题 编译器:VS2010旗舰版

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ map使用问题和迭代器问题 编译器:VS2010旗舰版相关的知识,希望对你有一定的参考价值。

代码:
#include<iostream>
#include<map>
#include<string>
using namespace std;
typedef map<string, string>::const_iterator CIT;
typedef map<string,string>::value_type cit;
template<class T1,class T2>
void show(CIT &c,map<T1,T2>&n)

for(c=n.begin();c!=n.end();++c)
cout<<c->first<<"\t"<<c->second<<endl;

int main()

string str="武汉";
map<string,string> name,name1;
name["范伟"]=str;
name1["牛若军"]="青岛";
name1.insert(name1.end(),cit("朱然","长春"));
name.insert(name1.begin(),name1.end());
cout<<"映射容器name中共有"<<name.size()<<"个元素\n";
CIT it;
show(it,name);
cout<<"查找关键字为“朱然”的所有类容并输出\n";
it=name.find("朱然");
if(it==name.end())
cout<<"没有这个关键字\n";
else
cout<<it->first<<"\t"<<it->second<<endl;
cout<<"关键字等于“范伟”的元素个数为:"<<name.count("范伟")<<endl;
cout<<"删除关键字为" 范伟 "的所有元素。\n";
name.erase("范伟");
cout<<"再次输出映射容器name中的所有元素.\n";
show(it,name);
cout<<"删除映射容器name中所有元素\n";
name.clear();
if(name.empty())
cout<<"映射容器name为空\n";
else
show(it,name);
system("pause");
return 0;


错误:
e:\c语言\123\123.cpp : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>e:\c语言\123\123.cpp(19): error C2001: 常量中有换行符
1>e:\c语言\123\123.cpp(19): error C2146: 语法错误: 缺少“]”(在标识符“闱掑矝”的前面)
1>e:\c语言\123\123.cpp(22): error C2001: 常量中有换行符
1>e:\c语言\123\123.cpp(22): error C2146: 语法错误: 缺少“;”(在标识符“涓厓绱燶n”的前面)
1>e:\c语言\123\123.cpp(22): error C2065: “涓厓绱燶n”: 未声明的标识符
1>e:\c语言\123\123.cpp(22): error C2143: 语法错误 : 缺少“;”(在“字符串”的前面)
1>e:\c语言\123\123.cpp(23): error C2146: 语法错误: 缺少“;”(在标识符“CIT”的前面)
1>e:\c语言\123\123.cpp(23): error C2146: 语法错误: 缺少“;”(在标识符“it”的前面)
1>e:\c语言\123\123.cpp(23): error C2275: “CIT”: 将此类型用作表达式非法
1> e:\c语言\123\123.cpp(5) : 参见“CIT”的声明
1>e:\c语言\123\123.cpp(23): error C2065: “it”: 未声明的标识符
1>e:\c语言\123\123.cpp(24): error C2065: “it”: 未声明的标识符
1>e:\c语言\123\123.cpp(26): error C2065: “it”: 未声明的标识符
1>e:\c语言\123\123.cpp(27): error C2065: “it”: 未声明的标识符
1>e:\c语言\123\123.cpp(30): error C2065: “it”: 未声明的标识符
1>e:\c语言\123\123.cpp(30): error C2227: “->first”的左边必须指向类/结构/联合/泛型类型
1> 类型是“'unknown-type'”
1>e:\c语言\123\123.cpp(30): error C2065: “it”: 未声明的标识符
1>e:\c语言\123\123.cpp(30): error C2227: “->second”的左边必须指向类/结构/联合/泛型类型
1> 类型是“'unknown-type'”
1>e:\c语言\123\123.cpp(32): error C2146: 语法错误: 缺少“;”(在标识符“锣冧紵”的前面)
1>e:\c语言\123\123.cpp(32): error C2065: “锣冧紵”: 未声明的标识符
1>e:\c语言\123\123.cpp(32): error C2143: 语法错误 : 缺少“;”(在“字符串”的前面)
1>e:\c语言\123\123.cpp(35): error C2065: “it”: 未声明的标识符
1>e:\c语言\123\123.cpp(41): error C2065: “it”: 未声明的标识符

cout<<"删除关键字为" 范伟 "的所有元素。\n";
改为
cout<<"删除关键字为\" 范伟 \"的所有元素。\n";

在解决方案窗口中对项目名鼠标右击,选择属性,字符集选择多字节字符集 ,vs2010默认是用unicode字符集的
参考技术A name["范伟"]=str;
这种用法非常的不方便,很多编译器都会崩溃。,还是改成这样吧
name[“doggy"]=str;

C++ STL map迭代器

一、前言

stl标准库为map容器配备的是双向迭代器(bidirectional iterator),因此map 容器迭代器只能进行 ++p、p++、--p、p--、*p 操作,并且迭代器之间只能使用 == 或者 != 运算符进行比较。

二、迭代器方法

方法功能
begin()返回指向容器中第一个(注意,是已排好序的第一个)键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器
end()返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器
rbegin()返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器
rend()返回指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器
cbegin()和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对
cend()和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对
crbegin()和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对
crend()和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。

这个的具体功能不再说明,和序列化容器是一样的功能,唯一不同的就是这里的数据是“键值对”。
对于迭代器的使用,已经有很多的实例,这里就不再说明了。

以上是关于c++ map使用问题和迭代器问题 编译器:VS2010旗舰版的主要内容,如果未能解决你的问题,请参考以下文章

将 SWIG 与 C++ 的 std::map 一起使用时,Java 没有迭代器

C++ STL map迭代器

C++ 中map 中迭代器的简单使用:

如何在 C++ 中反向迭代地图?

C++从入门到入土第二十篇:关联式容器-map和set

C++从入门到入土第二十篇:关联式容器-map和set