
C++ STL set插入数据
一、方法
1、insert
1)直接将键的值插入set容器
格式 说明 pair<iterator,bool> insert (const value_type& val); 普通引用方式传参 pair<iterator,bool> insert (value_type&& val); 右值引用方式传参以上 2 种语法格式的 insert() 方法,返回的都是 pair 类型的值,其包含 2 个数据,一个迭代器和一个 bool 值:
当向 set 容器添加元素成功时,该迭代器指向 set 容器新添加的元素,bool 类型的值为 true;
如果添加失败,即证明原 set 容器中已存有相同的元素,此时返回的迭代器就指向容器中相同的此元素,同时 bool 类型的值为 false。
std::set<std::string> myset1; //格式1 pair<set<std::string>::iterator, bool> ret; string str = "i am lin"; ret = myset1.insert(str); cout << "one iter->" << *(ret.first) << " , " << "bool = " << ret.second << endl; //格式2 ret = myset1.insert("i am huang"); cout << "two iter->" << *(ret.first) << " , " << "bool = " << ret.second << endl; //插入失败 ret = myset1.insert("i am huang"); cout << "failed iter->" << *(ret.first) << " , " << "bool = " << ret.second << endl; std::cout << "myset1 size: " << myset1.size() << std::endl; std::set<std::string>::iterator setIter = myset1.begin(); for (; setIter != myset1.end(); setIter++) { std::cout << "myset1 :" << *setIter << std::endl; }
结果如下:
2)指定将新元素插入到 set 容器中的具体位置
格式 说明 iterator insert (const_iterator position, const value_type& val); 以普通引用的方式传递 val 值 iterator insert (const_iterator position, value_type&& val); 以右值引用的方式传递 val 值以上 2 种语法格式中,insert() 函数的返回值为迭代器:
当向 set 容器添加元素成功时,该迭代器指向容器中新添加的元素;
当添加失败时,证明原 set 容器中已有相同的元素,该迭代器就指向 set 容器中相同的这个元素。
std::set<std::string> myset1; set<std::string>::iterator iter; //格式1 string str = "i am lin"; iter = myset1.insert(myset1.begin(), str); cout << "one insert iter->" << *iter << endl; //格式2 iter = myset1.insert(myset1.end(), "i am huang"); cout << "two insert iter->" << *iter << endl; std::cout << "myset1 size: " << myset1.size() << std::endl; std::set<std::string>::iterator setIter = myset1.begin(); for (; setIter != myset1.end(); setIter++) { std::cout << "myset1 :" << *setIter << std::endl; }
结果如下:
使用 insert() 方法将目标元素插入到 set 容器指定位置后,如果该元素破坏了容器内部的有序状态,set 容器还会自行对新元素的位置做进一步调整,即会判断有序性是否成立,不成立会调整键值对顺序。
3)向当前 set 容器中插入其它 set 容器指定区域内的所有元素
前提:2 个 set 容器存储的元素类型相同即可 template <class InputIterator> void insert (InputIterator first, InputIterator last); 插入其它 set 容器指定区域内的所有元素std::set<std::string> myset1{ "i am wang", "i am wu", "i am a", "i am kai"}; std::set<std::string> myset2; myset2.insert(++myset1.begin(), --myset1.end()); std::cout << "myset2 size: " << myset2.size() << std::endl; std::set<std::string>::iterator setIter = myset2.begin(); for (; setIter != myset2.end(); setIter++) { std::cout << "myset2 :" << *setIter << std::endl; }
结果如下:
4)一次性插入多个元素
void insert ( {E1, E2,...,En} );std::set<std::string> myset1{ "i am wang", "i am wu", "i am a", "i am kai"}; myset1.insert({ "i am ouyang","i am fang", "i am lu", "i am xu" }); std::cout << "myset1 size: " << myset1.size() << std::endl; std::set<std::string>::iterator setIter = myset1.begin(); for (; setIter != myset1.end(); setIter++) { std::cout << "myset1 :" << *setIter << std::endl; }
结果如下:
C++ 11 标准的 set 类模板中,还提供有另外 2 个成员方法,分别为 implace() 和 implace_hint() 方法,借助它们不但能实现向 set 容器添加新元素的功能,其实现效率也比 insert() 成员方法更高。
2、emplace
template <class... Args> pair<iterator,bool> emplace (Args&&... args);只需要传入构建新元素所需的数据即可,该方法可以自行利用这些数据构建出要添加的元素。另外,该方法的返回值类型为 pair 类型,其包含 2 个元素,一个迭代器和一个 bool 值:
当该方法将目标元素成功添加到 set 容器中时,其返回的迭代器指向新插入的元素,同时 bool 值为 true;
当添加失败时,则表明原 set 容器中已存在相同值的元素,此时返回的迭代器指向容器中具有相同键的这个元素,同时 bool 值为 false。
std::set<std::string> myset; pair<set<std::string, std::string>::iterator, bool> ret = myset.emplace("i am lin"); cout << "ret.iter = < value: " << *(ret.first) << ", result: " << ret.second << ">" << endl;
结果如下:
3、emplace_hint
template <class... Args> iterator emplace_hint (const_iterator position, Args&&... args);和 emplace() 方法相比:
该方法需要额外传入一个迭代器,用来指明新元素添加到 set 容器的具体位置(新元素会添加到该迭代器指向元素的前面);
返回值是一个迭代器,而不再是 pair 对象。当成功添加元素时,返回的迭代器指向新添加的元素;反之,如果添加失败,则迭代器就指向 set 容器和要添加元素的值相同的元素。
std::set<std::string> myset{"i am wu","i am kai","i am yang"}; set<std::string>::iterator iter = myset.emplace_hint(++myset.begin(), "i am lin"); cout << "iter = < value: " << *iter << " >" << endl; std::cout << "myset size: " << myset.size() << std::endl; std::set<std::string>::iterator setIter = myset.begin(); for (; setIter != myset.end(); setIter++) { std::cout << "myset1 :" << *setIter << std::endl; }
结果如下:
等待樱花盛开
小菜鸟一枚,望各位大佬不吝指教,用于记录学习
0 条评论
等待樱花盛开
小菜鸟一枚,望各位大佬不吝指教,用于记录学习
宣传栏
目录
一、方法
1、insert
1)直接将键的值插入set容器
格式 说明 pair<iterator,bool> insert (const value_type& val); 普通引用方式传参 pair<iterator,bool> insert (value_type&& val); 右值引用方式传参以上 2 种语法格式的 insert() 方法,返回的都是 pair 类型的值,其包含 2 个数据,一个迭代器和一个 bool 值:
当向 set 容器添加元素成功时,该迭代器指向 set 容器新添加的元素,bool 类型的值为 true;
如果添加失败,即证明原 set 容器中已存有相同的元素,此时返回的迭代器就指向容器中相同的此元素,同时 bool 类型的值为 false。
std::set<std::string> myset1; //格式1 pair<set<std::string>::iterator, bool> ret; string str = "i am lin"; ret = myset1.insert(str); cout << "one iter->" << *(ret.first) << " , " << "bool = " << ret.second << endl; //格式2 ret = myset1.insert("i am huang"); cout << "two iter->" << *(ret.first) << " , " << "bool = " << ret.second << endl; //插入失败 ret = myset1.insert("i am huang"); cout << "failed iter->" << *(ret.first) << " , " << "bool = " << ret.second << endl; std::cout << "myset1 size: " << myset1.size() << std::endl; std::set<std::string>::iterator setIter = myset1.begin(); for (; setIter != myset1.end(); setIter++) { std::cout << "myset1 :" << *setIter << std::endl; }
结果如下:
2)指定将新元素插入到 set 容器中的具体位置
格式 说明 iterator insert (const_iterator position, const value_type& val); 以普通引用的方式传递 val 值 iterator insert (const_iterator position, value_type&& val); 以右值引用的方式传递 val 值以上 2 种语法格式中,insert() 函数的返回值为迭代器:
当向 set 容器添加元素成功时,该迭代器指向容器中新添加的元素;
当添加失败时,证明原 set 容器中已有相同的元素,该迭代器就指向 set 容器中相同的这个元素。
std::set<std::string> myset1; set<std::string>::iterator iter; //格式1 string str = "i am lin"; iter = myset1.insert(myset1.begin(), str); cout << "one insert iter->" << *iter << endl; //格式2 iter = myset1.insert(myset1.end(), "i am huang"); cout << "two insert iter->" << *iter << endl; std::cout << "myset1 size: " << myset1.size() << std::endl; std::set<std::string>::iterator setIter = myset1.begin(); for (; setIter != myset1.end(); setIter++) { std::cout << "myset1 :" << *setIter << std::endl; }
结果如下:
使用 insert() 方法将目标元素插入到 set 容器指定位置后,如果该元素破坏了容器内部的有序状态,set 容器还会自行对新元素的位置做进一步调整,即会判断有序性是否成立,不成立会调整键值对顺序。
3)向当前 set 容器中插入其它 set 容器指定区域内的所有元素
前提:2 个 set 容器存储的元素类型相同即可 template <class InputIterator> void insert (InputIterator first, InputIterator last); 插入其它 set 容器指定区域内的所有元素std::set<std::string> myset1{ "i am wang", "i am wu", "i am a", "i am kai"}; std::set<std::string> myset2; myset2.insert(++myset1.begin(), --myset1.end()); std::cout << "myset2 size: " << myset2.size() << std::endl; std::set<std::string>::iterator setIter = myset2.begin(); for (; setIter != myset2.end(); setIter++) { std::cout << "myset2 :" << *setIter << std::endl; }
结果如下:
4)一次性插入多个元素
void insert ( {E1, E2,...,En} );std::set<std::string> myset1{ "i am wang", "i am wu", "i am a", "i am kai"}; myset1.insert({ "i am ouyang","i am fang", "i am lu", "i am xu" }); std::cout << "myset1 size: " << myset1.size() << std::endl; std::set<std::string>::iterator setIter = myset1.begin(); for (; setIter != myset1.end(); setIter++) { std::cout << "myset1 :" << *setIter << std::endl; }
结果如下:
C++ 11 标准的 set 类模板中,还提供有另外 2 个成员方法,分别为 implace() 和 implace_hint() 方法,借助它们不但能实现向 set 容器添加新元素的功能,其实现效率也比 insert() 成员方法更高。
2、emplace
template <class... Args> pair<iterator,bool> emplace (Args&&... args);只需要传入构建新元素所需的数据即可,该方法可以自行利用这些数据构建出要添加的元素。另外,该方法的返回值类型为 pair 类型,其包含 2 个元素,一个迭代器和一个 bool 值:
当该方法将目标元素成功添加到 set 容器中时,其返回的迭代器指向新插入的元素,同时 bool 值为 true;
当添加失败时,则表明原 set 容器中已存在相同值的元素,此时返回的迭代器指向容器中具有相同键的这个元素,同时 bool 值为 false。
std::set<std::string> myset; pair<set<std::string, std::string>::iterator, bool> ret = myset.emplace("i am lin"); cout << "ret.iter = < value: " << *(ret.first) << ", result: " << ret.second << ">" << endl;
结果如下:
3、emplace_hint
template <class... Args> iterator emplace_hint (const_iterator position, Args&&... args);和 emplace() 方法相比:
该方法需要额外传入一个迭代器,用来指明新元素添加到 set 容器的具体位置(新元素会添加到该迭代器指向元素的前面);
返回值是一个迭代器,而不再是 pair 对象。当成功添加元素时,返回的迭代器指向新添加的元素;反之,如果添加失败,则迭代器就指向 set 容器和要添加元素的值相同的元素。
std::set<std::string> myset{"i am wu","i am kai","i am yang"}; set<std::string>::iterator iter = myset.emplace_hint(++myset.begin(), "i am lin"); cout << "iter = < value: " << *iter << " >" << endl; std::cout << "myset size: " << myset.size() << std::endl; std::set<std::string>::iterator setIter = myset.begin(); for (; setIter != myset.end(); setIter++) { std::cout << "myset1 :" << *setIter << std::endl; }
结果如下: