C/C++

推荐列表 站点导航

当前位置:首页 > 脚本编程 > C/C++ >

C++_STL区间成员函数及区间算法总结,在这里总结下可替代循环的区

来源:网络整理  作者:  发布时间:2020-12-19 05:48
STL区间成员函数及区间算法总结,在这里总结下可替代循环的区间成员函数和区间算法;相比单元素遍历操作,使用区...

区间赋值

for_each(myvector.begin(),myvector.end(),myfunction); //15 25 35
//输出
std::vector<int> bvector;


container::container(InputIterator begin, // 区间的起点
int addfunction(int i ){

复制代码 代码如下:

对区间中每个元素执行操作后,将修改后的值写入到新区间中;

for_each:遍历,对每个元素都执行一个动作;
int myints[]={10,20,30,40,50,60,70};
3)更少的内存分配

myvector.push_back(10);
myvector.push_back(20);
2)更少的元素移动

复制代码 代码如下:

通用区间算法

                    InputIterator end); // 插入区间的终点

例:复制数组到vector:

在没有foreach区间迭代的时代,我们可以用for_each()算法来代替:

std::vector<int> second ({10, 20, 30, 30, 20, 10, 10, 20});  


复制代码 代码如下:

更复杂的版本(使用仿函数)replace_if
可以认为这个是for_each()算法不修改原区间的版本;
std::vector<int> myvector (myints,myints+9);

相比单元素遍历操作,使用区间成员函数的优势在于:

unique() 区间去重

myvector.erase(it,myvector.end());

iterator container::erase(const_iterator first, const_iterator last);

C++98只支持最原始的for循环,很多语言(java、python等)都实现了foreach区间迭代语法,这让C++程序员眼馋了很久;
}
std::vector<int> myvector;

复制代码 代码如下:

transform(myvector.begin(),myvector.end(),bvector.begin(),addfunction);
std::copy ( myints, myints+7, myvector.begin() );

c++11中新增了区间迭代,使得我们对for_each的依赖降低了,使用也更加方便:

for_each(bvector.begin(),bvector.end(),output); //bvector: 15 25 35
myvector.push_back(100);

for_each 区间迭代

int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };

复制代码 代码如下:

例如:

void output (int i) {  // output function
std::vector<int> myvector;
int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
}

区间成员函数

std::vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0
std::fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20

复制代码 代码如下:

void container::insert(iterator position, // 区间插入的位置



这个算法使用频率较低;
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20

所有标准容器提供了区间赋值的成员函数:

例:将以下区间中所有大于20替换为99:

myvector.push_back(20);
std::vector<int> myvector (7);

标准序列容器提供的erase:

    i += 5;
使用【unique-erase惯用法】:


例如:

std::vector<int> second ={10, 20, 30, 30, 20, 10, 10, 20}; 

例:对每个元素都加5:

iterator container::erase(iterator begin, iterator end);

    i+=5;

这一区别在c++11中终于统一了;c++11中,对关联容器调用erase之后会返回一个迭代器(指向被删除元素的下一个);


int myints[]={10,20,30,40,50,60,70};

注意,remove并不会真正删除元素,而只是将需要删除的元素放到到最后,同时返回一个新的尾部迭代器,
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20

std::vector<int> myvector;
    return i+5;

复制代码 代码如下:

比如,上述例子中,调用完remove后,vector中的值一般为 //10 30 30 10 10 10 10 20
例:将以下区间中所有20替换为99:

而关联容器的erase删除之后并不返回迭代器.【官方解释说如果实现成序列容器那样返回指向下一个迭代器,会导致无法接收的性能下降】;

                    InputIterator begin, // 插入区间的起点
std::remove(myvector.begin(), myvector.end(), 20); // 10 30 30 10 10 ? ? ?


myvector.erase(std::remove(myvector.begin(), myvector.end(), 20),myvector.end()); // 10 30 30 10 10
而如果希望真的删除元素,需要加上成员函数erase()来实现删除 【remove-erase惯用法】:

fill() 区间填充

for(auto &i : myvector )
std::vector<int> myvector;
{
}


复制代码 代码如下:


    std::cout << ' ' << i;

由于用到了仿函数,通过replace_if实现的,用for_each()也很容易实现;

int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
myvector.push_back(10);

用一个元素来重复填充区间;


std::vector<int> myvector (myints, myints+8);

从区间中删除指定元素;

例:用5填充vector前4个元素:

1)更少的函数调用
这个函数用于给容器赋值,会替代现有值,并根据需要分配空间;

void container::erase(iterator begin, iterator end);

复制代码 代码如下:

区间插入

序列容器调用erase之后,返回一个迭代器(被删除的那个元素的下一个),

标准容器都支持区间构造函数:

it = std::unique (myvector.begin(), myvector.end());   // 10 20 30 20 10 ?  ?  ?  ?
                  InputIterator end); // 区间的终点

copy() 区间复制


remove() 区间删除

还是for_each中的例子:

复制代码 代码如下:

从区间中删除相邻相同的元素,同样,这个算法也不会真正的删除元素,而是将待删除的元素移到区间尾部;

void container::assign(InputIterator begin, InputIterator end);


关联容器也支持区间插入,但由于其插入后的位置由其比较函数来决定,所以没有区间插入的位置这个参数;

遍历区间,进行值替换:

区间复制,一般用于多个容器间的数据传值;
这个算法被用的很普遍,其实,很多使用copy的场景,都可以使用区间成员函数来替代(也建议这么做);

bvector.resize(myvector.size());

replace() 区间替换

myvector.assign(myints,myints+7);

复制代码 代码如下:

}


int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };


在这里总结下可替代循环的区间成员函数和区间算法;

int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };


c++98的标准关联容器提供的erase为:

以上是c++98中常用法,在C++11中,vector可以直接初始化了:


std::replace (myvector.begin(), myvector.end(), 20, 99); // 10 99 30 30 99 10 10 99

在区间成员函数不适用的情况下也应该使用区间算法,至少,相比手写循环而言,它更加简单,有效,并且不容易出错;

复制代码 代码如下:

int myints[] = {10,20,20,20,30,30,20,20,10};           // 10 20 20 20 30 30 20 20 10
myvector.insert(myvector.begin(),myints,myints+8); //10 20 30 30 20 10 10 20 100
myvector.push_back(30);

复制代码 代码如下:

标准序列容器提供这种形式的insert:

bool bigerThen20 (int i) { return i > 20; }
与copy()算法的区别在于它不需要预先分配空间,并有更高的性能;

myvector.push_back(30);

复制代码 代码如下:

区间构造


transform() 区间迭代后新值另存为其它地方

区间删除

复制代码 代码如下:

std::replace_if (myvector.begin(), myvector.end(), bigerThen20, 99); //10 20 99 99 20 10 10 20
std::vector<int>::iterator it;

或者:

复制代码 代码如下:

void myfunction (int& i) {

复制代码 代码如下:

相关热词: C++

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/jiaob/cjj/5486.shtml

最新文章
只需要在调用Ctrl+B编译后 只需要在调用Ctrl+B编译后

时间:2021-01-13

OpenGL超级宝典visual studio OpenGL超级宝典visual studio

时间:2021-01-04

Directx11 教程(2) 基本的wi Directx11 教程(2) 基本的wi

时间:2021-01-04

LeetCode11ContainerWithMostWate LeetCode11ContainerWithMostWate

时间:2021-01-04

C语言简单IT之家速成 C语言简单IT之家速成

时间:2020-12-27

三分钟了解Activity工作流 三分钟了解Activity工作流

时间:2020-12-27

编译器是如何实现32位整型 编译器是如何实现32位整型

时间:2020-12-27

C++中lower_bound函数和upper C++中lower_bound函数和upper

时间:2020-12-27

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

C++_STL区间成员函数及区间算法总结,在这里总结下可替代循环的区

2020-12-19 编辑:

区间赋值

for_each(myvector.begin(),myvector.end(),myfunction); //15 25 35
//输出
std::vector<int> bvector;


container::container(InputIterator begin, // 区间的起点
int addfunction(int i ){

复制代码 代码如下:

对区间中每个元素执行操作后,将修改后的值写入到新区间中;

for_each:遍历,对每个元素都执行一个动作;
int myints[]={10,20,30,40,50,60,70};
3)更少的内存分配

myvector.push_back(10);
myvector.push_back(20);
2)更少的元素移动

复制代码 代码如下:

通用区间算法

                    InputIterator end); // 插入区间的终点

例:复制数组到vector:

在没有foreach区间迭代的时代,我们可以用for_each()算法来代替:

std::vector<int> second ({10, 20, 30, 30, 20, 10, 10, 20});  


复制代码 代码如下:

更复杂的版本(使用仿函数)replace_if
可以认为这个是for_each()算法不修改原区间的版本;
std::vector<int> myvector (myints,myints+9);

相比单元素遍历操作,使用区间成员函数的优势在于:

unique() 区间去重

myvector.erase(it,myvector.end());

iterator container::erase(const_iterator first, const_iterator last);

C++98只支持最原始的for循环,很多语言(java、python等)都实现了foreach区间迭代语法,这让C++程序员眼馋了很久;
}
std::vector<int> myvector;

复制代码 代码如下:

transform(myvector.begin(),myvector.end(),bvector.begin(),addfunction);
std::copy ( myints, myints+7, myvector.begin() );

c++11中新增了区间迭代,使得我们对for_each的依赖降低了,使用也更加方便:

for_each(bvector.begin(),bvector.end(),output); //bvector: 15 25 35
myvector.push_back(100);

for_each 区间迭代

int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };

复制代码 代码如下:

例如:

void output (int i) {  // output function
std::vector<int> myvector;
int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
}

区间成员函数

std::vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0
std::fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20

复制代码 代码如下:

void container::insert(iterator position, // 区间插入的位置



这个算法使用频率较低;
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20

所有标准容器提供了区间赋值的成员函数:

例:将以下区间中所有大于20替换为99:

myvector.push_back(20);
std::vector<int> myvector (7);

标准序列容器提供的erase:

    i += 5;
使用【unique-erase惯用法】:


例如:

std::vector<int> second ={10, 20, 30, 30, 20, 10, 10, 20}; 

例:对每个元素都加5:

iterator container::erase(iterator begin, iterator end);

    i+=5;

这一区别在c++11中终于统一了;c++11中,对关联容器调用erase之后会返回一个迭代器(指向被删除元素的下一个);


int myints[]={10,20,30,40,50,60,70};

注意,remove并不会真正删除元素,而只是将需要删除的元素放到到最后,同时返回一个新的尾部迭代器,
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20

std::vector<int> myvector;
    return i+5;

复制代码 代码如下:

比如,上述例子中,调用完remove后,vector中的值一般为 //10 30 30 10 10 10 10 20
例:将以下区间中所有20替换为99:

而关联容器的erase删除之后并不返回迭代器.【官方解释说如果实现成序列容器那样返回指向下一个迭代器,会导致无法接收的性能下降】;

                    InputIterator begin, // 插入区间的起点
std::remove(myvector.begin(), myvector.end(), 20); // 10 30 30 10 10 ? ? ?


myvector.erase(std::remove(myvector.begin(), myvector.end(), 20),myvector.end()); // 10 30 30 10 10
而如果希望真的删除元素,需要加上成员函数erase()来实现删除 【remove-erase惯用法】:

fill() 区间填充

for(auto &i : myvector )
std::vector<int> myvector;
{
}


复制代码 代码如下:


    std::cout << ' ' << i;

由于用到了仿函数,通过replace_if实现的,用for_each()也很容易实现;

int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
myvector.push_back(10);

用一个元素来重复填充区间;


std::vector<int> myvector (myints, myints+8);

从区间中删除指定元素;

例:用5填充vector前4个元素:

1)更少的函数调用
这个函数用于给容器赋值,会替代现有值,并根据需要分配空间;

void container::erase(iterator begin, iterator end);

复制代码 代码如下:

区间插入

序列容器调用erase之后,返回一个迭代器(被删除的那个元素的下一个),

标准容器都支持区间构造函数:

it = std::unique (myvector.begin(), myvector.end());   // 10 20 30 20 10 ?  ?  ?  ?
                  InputIterator end); // 区间的终点

copy() 区间复制


remove() 区间删除

还是for_each中的例子:

复制代码 代码如下:

从区间中删除相邻相同的元素,同样,这个算法也不会真正的删除元素,而是将待删除的元素移到区间尾部;

void container::assign(InputIterator begin, InputIterator end);


关联容器也支持区间插入,但由于其插入后的位置由其比较函数来决定,所以没有区间插入的位置这个参数;

遍历区间,进行值替换:

区间复制,一般用于多个容器间的数据传值;
这个算法被用的很普遍,其实,很多使用copy的场景,都可以使用区间成员函数来替代(也建议这么做);

bvector.resize(myvector.size());

replace() 区间替换

myvector.assign(myints,myints+7);

复制代码 代码如下:

}


int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };


在这里总结下可替代循环的区间成员函数和区间算法;

int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };


c++98的标准关联容器提供的erase为:

以上是c++98中常用法,在C++11中,vector可以直接初始化了:


std::replace (myvector.begin(), myvector.end(), 20, 99); // 10 99 30 30 99 10 10 99

在区间成员函数不适用的情况下也应该使用区间算法,至少,相比手写循环而言,它更加简单,有效,并且不容易出错;

复制代码 代码如下:

int myints[] = {10,20,20,20,30,30,20,20,10};           // 10 20 20 20 30 30 20 20 10
myvector.insert(myvector.begin(),myints,myints+8); //10 20 30 30 20 10 10 20 100
myvector.push_back(30);

复制代码 代码如下:

标准序列容器提供这种形式的insert:

bool bigerThen20 (int i) { return i > 20; }
与copy()算法的区别在于它不需要预先分配空间,并有更高的性能;

myvector.push_back(30);

复制代码 代码如下:

区间构造


transform() 区间迭代后新值另存为其它地方

区间删除

复制代码 代码如下:

std::replace_if (myvector.begin(), myvector.end(), bigerThen20, 99); //10 20 99 99 20 10 10 20
std::vector<int>::iterator it;

或者:

复制代码 代码如下:

void myfunction (int& i) {

复制代码 代码如下:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/jiaob/cjj/5486.shtml

相关文章

风云图片

推荐阅读

返回C/C++频道首页