所以,我有两个文本框(早期定义)和两个向量:
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];
双喜脸) 感谢大家的帮助兄弟:)
答案 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#这样的东西。