cb37a-_c++_STL_算法_复制元素copy_copy_backward
copy(),同一个容器内部区间的拷贝,或者容器与容器之间的拷贝
copy_backward()//向后copy
注意:
1.没有copy_if算法,可以使用remove_copy_if()算法
2.复制过程中要逆转元素次序,使用reverse_copy()算法
3.把容器内所有元素赋值给另一个容器,要使用赋值操作符或者容器的assign()成员函数
4.复制工程中删除某些元素,使用remove_copy()和remove_copy_if()算法
5.复制中改变元素,使用transform()或者replace_copy()算法
STL算法-修改性算法
for_each()
copy()
copy_backward()
transform()
merge()
swap_ranges()
fill()
fill_n()
generate()
generate_n()
replace()
replace_if()
replace_copy()
replace_copy_if()
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Assertion Failed!
Program: D:\Users\txwtech\projects\cb37a\Debug\cb37a.exe
File: d:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\vector
Line: 94
Expression: can't decrement vector iterator before begin
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
---------------------------
中止(A) 重试(R) 忽略(I)
---------------------------
copy_backward(ilist.begin(), ilist.end(), ivec.begin());
copy_backward的最后一个参数需要从最后往前面拷贝数据,所以应该是ivec.end().
Expression: can't decrement vector iterator before begin
意思就是指针溢出了,ivec.begin()之前的数据,就超出范围。
copy_backward是从ivec.end()的前一个数开始copy. ivec.end()是指向最后一个的下一个。
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Assertion Failed!
Program: D:\Users\txwtech\projects\cb37a\Debug\cb37a.exe
File: d:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\list
Line: 187
Expression: cannot dereference end list iterator
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
---------------------------
中止(A) 重试(R) 忽略(I)
---------------------------
Expression: cannot dereference end list iterator,空的容器就会出问题。
使用list迭代器,先定义容量。
比如:list<int> ilist(20);//默认20个0,
copy(ivec.begin(), ivec.end(), ilist2.begin());
copy到ilist必须要保证ilist有足够的空间。
或者使用back_inserter
copy(ivec.begin(), ivec.end(), back_inserter(ilist));//这样就不用考虑容器容量问题
rror C2065: “ostream_iterator”: 未声明的标识符,需要包含:#include <iterator>
/*cb37a-_c++_STL_算法_复制元素copy_copy_backward
copy(),同一个容器内部区间的拷贝,或者容器与容器之间的拷贝
copy_backward()//向后copy
注意:
1.没有copy_if算法,可以使用remove_copy_if()算法
2.复制过程中要逆转元素次序,使用reverse_copy()算法
3.把容器内所有元素赋值给另一个容器,要使用赋值操作符或者容器的assign()成员函数
4.复制工程中删除某些元素,使用remove_copy()和remove_copy_if()算法
5.复制中改变元素,使用transform()或者replace_copy()算法
STL算法-修改性算法
for_each()
copy()
copy_backward()
transform()
merge()
swap_ranges()
fill()
fill_n()
generate()
generate_n()
replace()
replace_if()
replace_copy()
replace_copy_if()
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Assertion Failed!
Program: D:\Users\txwtech\projects\cb37a\Debug\cb37a.exe
File: d:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\vector
Line: 94
Expression: can't decrement vector iterator before begin
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
---------------------------
中止(A) 重试(R) 忽略(I)
---------------------------
copy_backward(ilist.begin(), ilist.end(), ivec.begin());
copy_backward的最后一个参数需要从最后往前面拷贝数据,所以应该是ivec.end().
Expression: can't decrement vector iterator before begin
意思就是指针溢出了,ivec.begin()之前的数据,就超出范围。
copy_backward是从ivec.end()的前一个数开始copy. ivec.end()是指向最后一个的下一个。
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Assertion Failed!
Program: D:\Users\txwtech\projects\cb37a\Debug\cb37a.exe
File: d:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\list
Line: 187
Expression: cannot dereference end list iterator
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
---------------------------
中止(A) 重试(R) 忽略(I)
---------------------------
Expression: cannot dereference end list iterator,空的容器就会出问题。
使用list迭代器,先定义容量。
比如:list<int> ilist(20);//默认20个0,
copy(ivec.begin(), ivec.end(), ilist2.begin());
copy到ilist必须要保证ilist有足够的空间。
或者使用back_inserter
copy(ivec.begin(), ivec.end(), back_inserter(ilist));//这样就不用考虑容器容量问题
rror C2065: “ostream_iterator”: 未声明的标识符,需要包含:#include <iterator>
*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
#include <iterator>
using namespace std;
int main()
{
list<int> ilist;
for (int i = 0; i < 10; ++i)
ilist.push_back(i);
for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); ++iter)
cout << *iter << ' ';
cout << endl;
vector<int> ivec(ilist.size()*2);
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
cout << *iter << ' ';
cout << endl;
copy(ilist.begin(), ilist.end(), ivec.begin());
cout << "copy后的数据" << endl;
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
cout << *iter << ' ';
cout << endl;
//copy_backward的最后一个参数一定是ivec.end().
copy_backward(ilist.begin(), ilist.end(), ivec.end());
cout << "copy_backward后的数据" << endl;
//
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
cout << *iter << ' ';
cout << endl;
//例子2
vector<int> ivec2;
list<int> ilist2(20);//默认分配空间,20个0;
for (int i = 1; i <= 9; ++i)
ivec2.push_back(i);
copy(ivec2.begin(), ivec2.end(), ilist2.begin());
for (list<int>::iterator iter = ilist2.begin(); iter != ilist2.end(); ++iter)
cout << *iter << ' ';
cout << endl;
cout << "copy拷贝到输出流里面" << endl;
copy(ivec2.begin(), ivec2.end(), ostream_iterator<int>(cout," "));
cout << endl;
cout << "rbegin()逆向迭代器拷贝" << endl;
copy(ivec2.rbegin(), ivec2.rend(), ilist2.begin());
for (list<int>::iterator iter = ilist2.begin(); iter != ilist2.end(); ++iter)
cout << *iter << ' ';
cout << endl;
return 0;
}
/*cb37b_c++_
*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<char> source(10, '.');
for (char c = 'a'; c <= 'f'; c++)
{
source.push_back(c);
}
source.insert(source.end(), 10, '.');
for (vector<char>::iterator iter = source.begin(); iter != source.end(); ++iter)
cout << *iter << ' ';
cout << endl;
vector<char> c1(source.begin(), source.end());
copy(c1.begin() + 10, c1.begin() + 16, c1.begin() + 7);
//自己对自己容器修改
/*
. . . . . . . . . . a b c d e f . . . . . . . . . .
. . . . . . . a b c d e f d e f . . . . . . . . . .
把a b c d e f从索引7开始拷贝,覆盖。
*/
for (vector<char>::iterator iter = c1.begin(); iter != c1.end(); ++iter)
cout << *iter << ' ';
cout << endl;
vector<char> c2(source.begin(), source.end());
copy_backward(c2.begin() + 10, c2.begin() + 16, c2.begin() + 19);
//从f开始拷贝,从右边,最后面开始拷贝的。
for (vector<char>::iterator iter = c2.begin(); iter != c2.end(); ++iter)
cout << *iter << ' ';
cout << endl;
}