关于c++:C-STL-set插入数据

2次阅读

共计 3669 个字符,预计需要花费 10 分钟才能阅读完成。

一、办法

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