我一生都无法弄清楚为什么这不起作用。
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int solution(vector<int> a) {
map<int, bool> ints;
int b;
for(int i = 0; i < a.size(); i++) {
if(ints[a.at(i)]) {
return i;
}
else {
ints.insert(make_pair((a.at(i)), true));
cout << a.at(i) << " " << ints[a.at(i)] << endl;
}
}
return -1;
}
int main() {
vector<int> a = {2, 1, 3, 5, 3, 2};
solution(a);
return 0;
}
重点是返回第一个重复项的位置,但 make_pair 从未完成其工作。我不知道为什么,但它不起作用,正如您通过测试输出看到的那样,它永远不会将 ints[someint] 变为布尔值 true。然而,如果我用整数替换 a.at(i) ,那么输出将如预期的那样。 到底是怎么回事?你不能将 a.at(i) 作为 make_pair 的参数传递吗?
ints[a.at(i)]
如果
false
尚不存在,会将 a.at(i)
插入到地图中。
ints.insert(make_pair((a.at(i)), true)
如果 a.at(i)
已经存在,
将无法插入到地图中。这意味着您永远不会将地图的任何元素设置为
true
。
有几个选项可以解决这个问题。
insert
返回一对迭代器和一个布尔值,指示插入是否成功。您可以使用它来覆盖现有值:
auto result = ints.insert(make_pair((a.at(i)), true);
if (!result.second)
{
*result.first = true;
}
首先使用
[]
运算符更简单:
ints[a.at(i)] = true;
或者,您可以利用
insert
永远不会覆盖元素的事实来一步完成所有操作:
for (auto i : a)
{
auto result = ints.insert({i, true});
if (!result.second) return i;
}
因为您在地图中存储的只是
true
,一组可能会更简单:
std::set<int> ints;
for (auto i : a)
{
auto result = ints.insert(i);
if (!result.second) return i;
}