以下程序的这一行如何包含特定元素的迭代器?

How does this line the following program contains the iterator to specific element?

我在 cplusplus.com 上找到了以下程序。

// set::insert
#include <iostream>
#include <set>

int main (){
    std::set<int> myset;
    std::set<int>::iterator it;
    std::pair<std::set<int>::iterator, bool> ret;

    // set some initial values:
    for (int i = 1; i <= 5; i++) myset.insert(i*10);    // set: 10 20 30 40 50

    ret = myset.insert(20);                // no new element inserted

    if (ret.second == false) it = ret.first;  // "it" now points to element 20

    myset.insert (it, 25);                 // max efficiency inserting
    myset.insert (it, 24);                 // max efficiency inserting
    myset.insert (it, 26);                 // no max efficiency inserting

    int myints[] = {5, 10, 15};            // 10 already in set, not inserted
    myset.insert (myints, myints+3);

    std::cout << "myset contains:";
    for (it = myset.begin(); it != myset.end(); it++)
        std::cout << ' ' << *it;
    std::cout << '\n';

    return 0;
}

这个程序的输出是:

myset contains: 5 10 15 20 24 25 26 30 40 50

在第 16 行,注释说 std::set<int>::iterator it 现在指向元素 20,即集合中的第二个元素。但我似乎不明白为什么会这样,也不明白 if (ret.second == false) it = ret.first; 语句实际上是如何工作的。

如果有人向我解释这段代码的工作原理,那将非常有帮助。但是,请记住我是 std::set.

的新手

single element (1): pair<iterator,bool> insert (const value_type& val);

The single element versions (1) return a pair, with its member pair::first set to an iterator pointing to either the newly inserted element or to the equivalent element already in the set. The pair::second element in the pair is set to true if a new element was inserted or false if an equivalent element already existed.

上述 http://www.cplusplus.com/reference/set/set/insert/ 的释义清除了所有内容。

for (int i=1; i<=5; ++i) myset.insert(i*10);这里已经插入了20

你再次尝试插入 20,它已经存在,所以插入 returns 包含 iteratorfalsepair,即 pairsecond 项是 false.

P.S。如果您使用的是现代 C++ 标准,例如(C++11、14、17 或 20),那么您应该参考 https://en.cppreference.com/w/,因为它已更新。

来自cppreference

Returns a pair consisting of an iterator to the inserted element (or to the element that prevented the insertion) and a bool value set to true if the insertion took place.

由于您的示例中的集合已经包含元素 20,它的迭代器是 returned。

这样做的原因是插入算法的一部分是为这个新元素寻找一个位置。如果它在容器中,这个地方显然与我们寻找它的地方相同。

因此,我们再次查看它应该在的位置,如果它不在那里,我们就把它放在那里。如果是,那么我们只需 return 一个迭代器到这个地方。那么这个额外的操作就基本免费了