通过TCHAR键名在MAP中查找项目

时间:2013-04-06 17:32:00

标签: c++ map vector tchar

所以,我有两个文本框(早期定义)和两个向量:

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

和地图:

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

映射init:

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

我收到调试断言错误“map / set iterator not dereferencable”.. :(

如果我会做同样的事情,但会将其改为L“one”:

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

所以它会起作用...... 为什么它不能用向量的值来工作?我用调试器检查了我的vector值 - 它的'L“一个也是''!但无论如何都不起作用......

注意:我还试图找到没有.find()方法的单词:

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

如果我将'v1.at(0)'更改为L“one”,它将再次起作用

Heeeeeelp :(为什么不起作用?

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

Yeeeeeeeah现在可以了! :) 轻松修复:

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

双喜脸) 感谢大家的帮助兄弟:)

2 个答案:

答案 0 :(得分:0)

我认为“map / set iterator not dereferencable”是因为你试图取消引用指向end()的迭代器,你应该检查find是否确实发现了什么。

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

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

保持为关键指针,它们的值在v1中是不同的,因此无法找到它。您可以检查它是否要保留您的设计(迭代所有映射值并打印键值,然后对v1执行相同操作),或者以正确的方式执行并按照注释中的建议使用std :: wstring。

答案 1 :(得分:0)

不要使用TCHAR *作为地图键,它只会让你感到痛苦和头痛。您 会因为引用已释放的内存而导致内存泄漏和/或崩溃。

如果不是unicode,TCHAR只是char的typedef,如果是unicode,则只是wchar_t。

你可以做这样的事情

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 ++编写你的程序,而不是使用像C#这样的东西。