2013-04-06 19 views
-1

于是找到地图的项目,我有两个文本框(早期定义)和两个向量:由TCHAR键名

std::vector<TCHAR*> v1; 
std::vector<int> v2; 

与地图:

std::map <TCHAR*, int> m1; 
std::map <TCHAR*, int>:: iterator i1; 

地图初始化:

void mapInit() 
{ 
m1[L"one"] = 1; 
m1[L"two"] = 2; 
m1[L"three"] = 3; 
m1[L"four"] = 4; 
m1[L"five"] = 5; 
m1[L"six"] = 6; 
m1[L"seven"] = 7; 
m1[L"eight"] = 8; 
m1[L"nine"] = 9; 
m1[L"ten"] = 10; 
} 

我应该从第一个文本框中获得单词“one”,并将其写入矢量'v1'(文本框将来必须有更多的单词,所以我不能在没有矢量的情况下做到这一点) )。 后,该程序具有通过键名在地图所需的值来查找:

TCHAR *zr = v1.at(0); // v1.at(0) has the word `one` atm 
i1 = m1.find(zr); // want to get value `1` by key `one` 
int z = i1->second; // and get it completely 

我得到了一个调试断言错误“图/套迭代器不dereferencable” .. :(

我是否会?做都一样,但将其更改为L“一”:

TCHAR *zr = L"one"; // 
i1 = m1.find(zr); 
int z = i1->second; 

所以它的作品... 为什么它不与矢量值工作,我用我的调试器的矢量值检查 - 它'L'one''too!但是不管用......

注:我也试图找到没有.find字()方法:

TCHAR *zr = v1.at(0); 
int z = m1[zr]; // - now `z` returns a null... 

如果我会改变 'v1.at(0)' 到L “一”,它会重新工作

Heeeeeelp :(为什么它不工作?

============================================== ===

Yeeeeeeeah现在它的工作! :) 简单的解决办法:

wstring zr = v1.at(0); 
int z = m1[zr]; 

双笑脸) 感谢大家的帮助BRO-S :)

+1

使用'std :: wstring'而不是'TCHAR *' – 2013-04-06 17:36:27

+0

可能重复[std :: map不按预期行事](http://stackoverflow.com/questions/10937605/stdmap-not-behaving-as -expected) – 2013-04-06 17:43:18

+0

谢谢你的回答。方法GetWindowText()允许我从文本框中获取文本,返回TCHAR值类型...如果我将使用wstring,编译器会说“std:wstring与LPWSTR不兼容”。我编程的win32应用程序。没有其他解决方案? ( – FireForce 2013-04-06 17:45:55

回答

0

我想,“地图/套迭代器不dereferencable”是因为你试图指向end()的解引用迭代器,你应该检查find是否找到了任何东西。

的原因可能是因为你的地图:

std::map <TCHAR*, int> m1; 

保持关键指针,其值是V1不同的,所以它不能够找到它。如果你想保留你的设计(迭代所有映射值和打印键值,然后在v1中执行相同操作),或者按照正确的方式使用std :: wstring,可以按照注释中的建议检查它。

+0

问候它真的无法找到想要的项目所以你是对的地图不允许我将std :: wstring设置为一个类型。语法正常,但编译失败,出现错误C2784:bool std :: operator <(const std :: _树<_Traits>&,const std :: _树<_Traits>&):不可能返回模板lalala的参数“和其他几个错误... 无论如何,我明白我的失败,将尝试修复它:) – FireForce 2013-04-06 18:18:56

+0

loooooool我忘了添加“包括”我的应用程序,并花了我的生命小时的徒劳....现在是作品:) ) – FireForce 2013-04-06 20:07:25

0

不要使用TCHAR *作为您的映射键,它只会导致您的痛苦和头痛。你有内存泄漏和/或崩溃引用释放的内存。

TCHAR只是char的typedef,如果不是unicode,并且wchar_t是unicode的话。

你可以做这样的事情

typedef std::basic_string<TCHAR> tstring; 

然后声明地图作为

std::map<tstring,int> 

注意不要用一个指针字符串。你应该能够将GetWindowText返回的任何内容转换为tstring。

您可以使用Win32 API的

tstring window_text(max_window_text,0); 
auto ncount = ::GetWindowText(window_hwnd,&window_text[0],window_text.size()); 
if(ncount){ 
    window_text.resize(ncount); 
} else{ 
    // handle failure 
} 

这样做会为你节省很多的痛苦。

知道如何从TCHAR *转换为std :: string/wstring对于能够为Windows编写良好的本地C++程序非常重要。这是你需要学习的东西,所以如果你在发布代码和错误方面仍然有问题。如果你不学习如何做到这一点,我会建议你而不是用C++编写你的程序在Windows中,而不是使用类似C#的东西。