以下程序的这一行如何包含特定元素的迭代器?
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 包含 iterator
和 false
的 pair
,即 pair
的 second
项是 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 一个迭代器到这个地方。那么这个额外的操作就基本免费了
我在 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 包含 iterator
和 false
的 pair
,即 pair
的 second
项是 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 一个迭代器到这个地方。那么这个额外的操作就基本免费了