为什么传入来自向量的整数在 make_pair 中不起作用?

问题描述 投票:0回答:1

我一生都无法弄清楚为什么这不起作用。

#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 的参数传递吗?

c++ vector maps
1个回答
0
投票
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.