新手学C++,请教一个关于stl中map的问题

CHID 2010-11-11 09:54:17
新手学C++,请教一个关于stl中map的问题:
1.为什么cout<<txt<<endl;输出的是乱码,用cout如何实现正确输出?
2.txt.Format("ID:%d,Value:%s",it.ID,it.Value); “it.Value”为什么显示的不是修改后的值“ABC”,怎样才能更改其中的内容?
3.因为是新手,这些代码有哪些地方可以改进的吗?
谢谢。
下面是“Item.cpp”的代码:

#include "iostream"
#include "afxwin.h"
#include "map"
using namespace std;

class Item
{
public:
int ID;
CString Value;
};

class Items
{
public:
Item GetItem(int ID)
{
return m_Items[ID];
}

void AddItem(int ID,CString Value)
{
Item it;
it.ID=ID;
it.Value=Value;
m_Items.insert(pair<int,Item>(ID,it));
}


private:
map<int,Item> m_Items;
};

int main()
{

Items its;
int ID;
CString Value;

for (int i=0;i<10;i++)
{
ID=i;
Value.Format("Value%d",i*10);

its.AddItem( ID,Value);
}

printf("正常获取第六个元素的值:\n");
CString txt;
Item it=its.GetItem(5);
txt.Format("ID:%d,Value:%s",it.ID,it.Value);
printf("%s\n",txt);
//为什么这里无法正确输出字符串
cout<<txt<<endl;

printf("\n更改第六个元素后显示:\n");
it.Value="ABC";
txt.Format("ID:%d,Value:%s",it.ID,it.Value);
printf("%s\n",txt);

printf("\n重新获取第六个元素后显示:\n");
it=its.GetItem(5);
//为什么这里 it.Value的值没有变为ABC?
txt.Format("ID:%d,Value:%s",it.ID,it.Value);
printf("%s\n",txt);

return 0;
};

...全文
157 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
noryes 2010-11-12
  • 打赏
  • 举报
回复
混用C与C++
boxban 2010-11-12
  • 打赏
  • 举报
回复

class Items
{
public:
//返回引用
const Item& GetItem(int ID) const
{
return m_Items[ID];
}

//返回引用
Item& GetItem(int ID)
{
return m_Items[ID];
}

。。。
}


void main()
{
//注意这里使用“引用”类型,这样才能将修改反映在map中
Item& it=its.GetItem(5);
it.Value = "new-value";


//你现在并不想修改item的值,所以使用“引用常量”
const Item& it2=its.GetItem(5);
cout << (LPCTSTR)it2.value << endl;

}


另外,你对map的理解还不够深入
1.插入的地方可以直接写成 items[ID] = value;
2.如果可能,尽量返回引用,这样有助于提升代码效率
dingshaofengbinbin 2010-11-12
  • 打赏
  • 举报
回复
你怎么用CString啊,混用!!!
CHID 2010-11-12
  • 打赏
  • 举报
回复
问题已解决,谢谢各位。
CHID 2010-11-12
  • 打赏
  • 举报
回复
多谢Csuxiaowu和Jim_King_2000了。
第二个问题,“it.Value”为什么显示的不是修改后的值“ABC”,怎样才能更改其中的内容呢?
Jim_King_2000 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chid 的回复:]

引用 1 楼 csuxiaowu 的回复:
printf("%s\n",txt);
//为什么这里无法正确输出字符串
cout<<txt<<endl;
txt是CString对象啊

--------------------------------------------
cout能输出CString对象吗,如果要输出,怎么实现?
[/Quote]
不能。有两个办法:
1、cout << txt.GetString(); cout不支持CString对象,但是支持const char *。用CString::GetString()即可获取C-style的字符串。
2、实现ostream &operator<<(ostream &os, const CString &cs);

ostream &operator<<(ostream &os, const CString &cs)
{
return os << cs.GetString();
}

有了它,cout << txt;就能干活了。
CHID 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 csuxiaowu 的回复:]
printf("%s\n",txt);
//为什么这里无法正确输出字符串
cout<<txt<<endl;
txt是CString对象啊
[/Quote]
--------------------------------------------
cout能输出CString对象吗,如果要输出,怎么实现?
Csuxiaowu 2010-11-11
  • 打赏
  • 举报
回复
printf("%s\n",txt);
//为什么这里无法正确输出字符串
cout<<txt<<endl;
txt是CString对象啊

33,322

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧