-1

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

 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

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

如果我将做所有相同但将其更改为 L"one":

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

所以它会起作用......为什么它不能与向量值一起使用?我用调试器检查了我的向量值——它也是'L"one"'!但无论如何都不起作用...

注意:我也试图找到没有 .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];

双喜临门)谢谢大家的帮助兄弟:)

4

2 回答 2

0

我想“map/set iterator not dereferencable”是因为你试图取消引用指向 end() 的迭代器,你应该检查 find 是否真的找到了任何东西。

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

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

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

于 2013-04-06T17:48:42.177 回答
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++ 程序非常重要。这是你需要学习的东西,所以如果你仍然在邮政编码和错误中遇到问题。如果您不了解如何执行此操作,我建议您不要在 Windows 中使用 C++ 编写程序,而是使用 C# 之类的东西。

于 2013-04-06T19:06:11.753 回答