版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38132420/article/details/79173169
大学期间没有学过C++,大学毕业后开发主要的语言是C++,其实应该说是C++98。看了c++ primer等书籍,有好多感觉都用不着。后来接触了golang,渐渐的发现C++98用起来很不方便。现在学习C++11发现,其实C++11已经和现在很多高级语言使用起来一样方便了,且不失去其高效性。所以,C++没有GC。
后续,将慢慢学习C++11,从array开始记录吧。先不研究内部实现,后续再深入研究。array是一个固定大小的顺序容器,不能动态改变大小。实现的方法如下:
方法实例:
1、begin()、end()和其他stl容器一样的意思
// array::begin example
#include <iostream>
#include <array>
int main ()
{
std::array<int,5> myarray = { 2, 16, 77, 34, 50 };
std::cout << "myarray contains:";
for ( auto it = myarray.begin(); it != myarray.end(); ++it )
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
结果:
myarray contains: 2 16 77 34 50
2、rbegin()、rend() 和 begin()、end()反过来
// array::rbegin/rend
#include <iostream>
#include <array>
int main ()
{
std::array<int,4> myarray = {4, 26, 80, 14} ;
std::cout << "myarray contains:";
for ( auto rit=myarray.rbegin() ; rit < myarray.rend(); ++rit )
std::cout << ' ' << *rit;
std::cout << '\n';
return 0;
}
结果:
myarray contains: 14 80 26 4
4、cbengin()、cend()、crbegin()、crend()和没加c的接口一样,只是不能改变迭代子的值。
5、size() 返回数组的大小,对应函数有用constexpr修饰,编译器会把结果当作一个常量对待。max_size()返回的结果和size()结果一致。
#include <iostream>
#include <array>
int main ()
{
std::array<int,5> myints;
std::cout << "size of myints: " << myints.size() << std::endl;
std::cout << "sizeof(myints): " << sizeof(myints) << std::endl;
return 0;
}
结果:
size of myints: 5
sizeof(myints): 20
6、empty() 判断数组是否为空,如果长度为0,返回false,非0返回true。
// array::empty
#include <iostream>
#include <array>
int main ()
{
std::array<int,0> first;
std::array<int,5> second;
std::cout << "first " << (first.empty() ? "is empty" : "is not empty") << '\n';
std::cout << "second " << (second.empty() ? "is empty" : "is not empty") << '\n';
return 0;
}
结果:
first is empty
second is not empty
7、[]操作符—用于取值和赋值
// array::operator[]
#include <iostream>
#include <array>
int main ()
{
std::array<int,10> myarray;
unsigned int i;
// assign some values:
for (i=0; i<10; i++) myarray[i]=i;
// print content
std::cout << "myarray contains:";
for (i=0; i<10; i++)
std::cout << ' ' << myarray[i];
std::cout << '\n';
return 0;
}
结果:
myarray contains: 0 1 2 3 4 5 6 7 8 9
8、at(int)–和[]操作运算符实现一样的功能。
// array::at
#include <iostream>
#include <array>
int main ()
{
std::array<int,10> myarray;
// assign some values:
for (int i=0; i<10; i++) myarray.at(i) = i+1;
// print content:
std::cout << "myarray contains:";
for (int i=0; i<10; i++)
std::cout << ' ' << myarray.at(i);
std::cout << '\n';
return 0;
}
结果:
myarray contains: 1 2 3 4 5 6 7 8 9 10
9、front()、back() 获取数组的第一个元素(最后一个元素),也可以对其进行赋值。
// array::front
#include <iostream>
#include <array>
int main ()
{
std::array<int,3> myarray = {2, 16, 77};
std::cout << "front is: " << myarray.front() << std::endl; // 2
std::cout << "back is: " << myarray.back() << std::endl; // 77
myarray.front() = 100;
std::cout << "myarray now contains:";
for ( int& x : myarray ) std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
结果:
front is: 2
back is: 77
myarray now contains: 100 16 77
10、data()获取数组头指针
// array::data
#include <iostream>
#include <cstring>
#include <array>
int main ()
{
const char* cstr = "Test string";
std::array<char,12> charray;
std::memcpy (charray.data(),cstr,12);
std::cout << charray.data() << '\n';
return 0;
}
结果:
Test string
11、fill() 将数组每个元素都固定填一个值。
// array::fill example
#include <iostream>
#include <array>
int main () {
std::array<int,6> myarray;
myarray.fill(5);
std::cout << "myarray contains:";
for ( int& x : myarray) { std::cout << ' ' << x; }
std::cout << '\n';
return 0;
}
结果:
myarray contains: 5 5 5 5 5 5
12、swap() 交换两个数组
// swap arrays
#include <iostream>
#include <array>
int main ()
{
std::array<int,5> first = {10, 20, 30, 40, 50};
std::array<int,5> second = {11, 22, 33, 44, 55};
first.swap (second);
std::cout << "first:";
for (int& x : first) std::cout << ' ' << x;
std::cout << '\n';
std::cout << "second:";
for (int& x : second) std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
结果:
first: 11 22 33 44 55
second: 10 20 30 40 50
可以被std::get操作
// arrays as tuples
#include <iostream>
#include <array>
#include <tuple>
int main ()
{
std::array<int,3> myarray = {10, 20, 30};
std::tuple<int,int,int> mytuple (10, 20, 30);
std::tuple_element<0,decltype(myarray)>::type myelement; // int myelement
myelement = std::get<2>(myarray);
std::get<2>(myarray) = std::get<0>(myarray);
std::get<0>(myarray) = myelement;
std::cout << "first element in myarray: " << std::get<0>(myarray) << "\n";
std::cout << "first element in mytuple: " << std::get<0>(mytuple) << "\n";
return 0;
}
结果:
first element in myarray: 30
first element in mytuple: 10
重载运算符,对应每个元素重载运算符结果。
// array comparisons
#include <iostream>
#include <array>
int main ()
{
std::array<int,5> a = {10, 20, 30, 40, 50};
std::array<int,5> b = {10, 20, 30, 40, 50};
std::array<int,5> c = {50, 40, 30, 20, 10};
if (a==b) std::cout << "a and b are equal\n";
if (b!=c) std::cout << "b and c are not equal\n";
if (b<c) std::cout << "b is less than c\n";
if (c>b) std::cout << "c is greater than b\n";
if (a<=b) std::cout << "a is less than or equal to b\n";
if (a>=b) std::cout << "a is greater than or equal to b\n";
return 0;
}
结果:
a and b are equal
b and c are not equal
b is less than c
c is greater than b
a is less than or equal to b
a is greater than or equal to b