cb37a_c++_STL_算法_复制元素copy_copy_backward

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;


}
发布了469 篇原创文章 · 获赞 211 · 访问量 95万+

猜你喜欢

转载自blog.csdn.net/txwtech/article/details/104447157