初学STL:请问list::get_allocator的什么东西啊?allocator是什么东西

时间:2022-02-08 22:46:15
#include <list>
#include <iostream>

int main( ) 
{
   using namespace std;
   list <int>::iterator c4_Iter, c5_Iter, c6_Iter;
   list <int> c2( 5, 2 );

    list <int> c4(c2);

    c4_Iter = c4.begin( );
    c4_Iter++;
    c4_Iter++;
    list <int> c5( c4.begin( ), c4_Iter );

    c4_Iter = c4.begin( );
    c4_Iter++;
    c4_Iter++;
    list <int> c6( c4.begin( ), c4_Iter, c2.get_allocator( ) );
}
结果c5 = 2 2 ,c6 = 2 2。 这里的c5,c6有什么异同呢?

10 个解决方案

#1


分配器,在stl里面一般不会调用new或者alloc来分配内存。
而且通过一个allocator对象的相关方法来分配(以及释放)。

这样做是为了能够自定义内存分配的行为,如果你不要自定义就用默认的。

#2


for(;;)
{
printf("Select: \n1-I know the length of two legs of a right triangle.\n");
printf("2-I know the length of the hypotenuse and a leg.\n?");
scanf("%u",&ch);
printf("What is the length of the longer side? \n?");
scanf("%f",&c);
printf("And the other? \n?");
scanf("%f",&d);
a=pow(c,2);
b=pow(d,2);  


if(ch==1)
{
d=sqrt(a+b);
printf("The hypotenuse is %f.\n",d);
break;
}
if(ch==2)
{
d=sqrt(a-b);
printf("The unknown leg is %f.\n",d);
break;
}
}
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
}
/* Distance Formula, a special application of Pythag. Theorem */
/* NAB 4-10-01.
NAB 4-27-01 Code Optmzd*/
if(sel==7)
{
printf("Enter the first X coordinate, then the first Y, then the second X coordinate, then the second Y.");
a=distance();
printf("The distance between is %f\n",a);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);

}
/* Equation for a Circle, another application of the Pythagorean Theorem */
/* The Fearless NAB 4-10-01 
NAB 4-27-01 Code Optmzd
NAB 6-14-01 Area Option Added */
if(sel==8)
{
printf("Enter the coordinates for the center of the circle, then the coordinates of a set of points on the circumfrence.");
a=distance();
b=pow(a,2)*pi;
printf("The length of the radius is %f.\nThe area of the circle is %f.\n",a,b);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);

}


/* Trig Functs - A function to output trig functions (sin,tan,cos) in degree, instead of the radians I get everywhere else :-) I guess Im just a degrees kinda guy! */
/* NAB 5-24-01 */    
if(sel==9)
{
for(;;)
{
printf("I know (choose best answer from the whole list):For an angle, the sides that are\n\t1-Opposite and Adjacent (Tangent)\n\t2-Adjacent and the Hypotenuse (Cosine)\n\t3-Opposite and Hypotenuse (Sine)\nI know an angle measure and the measure of the side that is, in relation to the angle:\n\t4-Opposite (s tan a)\n\t5-the Hypotenuse (s cos a and s sin a)\nRemember, the 90 degree angle is not included!!!\n?");
scanf("%u",&ch);
if(ch==1)
{
printf("Enter Opposite side length.\n?");
scanf("%f",&a);
printf("And the Adjacent side...\n?");
scanf("%f",&b);
c=(atan(a/b))*(180/pi);  
printf("Angle is %f degrees.\n",c);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
break;
}
if(ch==2)
{
printf("Enter Adjacent side length.\n?");
scanf("%f",&a);
printf("And the Hypotenuse...\n?");
scanf("%f",&b);
c=(acos(a/b))*(180/pi);  
printf("Angle is %f degrees.\n",c);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
break;
}
if(ch==3)
{
printf("Enter Opposite side length.\n?");
scanf("%f",&a);
printf("And the Hypotenuse...\n?");
scanf("%f",&b);
c=(asin(a/b))*(180/pi);  
printf("Angle is %f degrees.\n",c);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
break;
}
if(ch==4)
{
printf("Enter side opposite angle.\n?");
scanf("%f",&a);
printf("And the angle...\n?");
scanf("%f",&b);
b=b/(180/pi);
c=(a*tan(b));
printf("Adjacent side is %f degrees.\n",c);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
break;
}
if(ch==5)
{
printf("Enter hypotenuse.\n?");
scanf("%f",&a);
printf("And the angle...\n?");
scanf("%f",&b);
b=b/(180/pi);
c=(a*cos(b));
d=(a*sin(b));
printf("The side adjacent to the angle is %f, and the side opposite is %f.\n",c,d);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
break;
}
}
}

#3


sorry,发错了,:P

#4


我也用了一次过,但是没有成功.可能还是语法上的问题 . 

有没有人可以给一个短小一点的例子. 用allocator的

#5


建议楼主去看jjhou的《SGI STL 源代码分析》

#6


不是很明白的楼主的意图

list <int> c2( 5, 2 ); 的语义是让 c2 有 5个 2 的意思

c5_Iter, c6_Iter 也是 list <int> 的迭代子,没有使用.


#7


如果是初学,可以不考虑allocator,一直使用默认值,

等你功力长进到一定的程度,再考虑,就不吃力了

#8


template<typename _InputIterator>
      list(_InputIterator __first, _InputIterator __last,
           const allocator_type& __a = allocator_type())

当你用:list <int> c6( c4.begin( ), c4_Iter, c2.get_allocator( ) );
时:
    allocator_type
    get_allocator() const { return _Base::get_allocator(); }
其实是一样的,就是你指定的值与默认值都是一样的.没什么很大的意义.除非你给出你自己不同于STL使用的分配器模型.

    typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type
            allocator_type;

#9


初学STL最好还是别看allocator了,先看看容器和算法怎么用了.

allocator不同的实现都不一样

#10


只要知道他是用来给容器进行内存管理的就行了.

#1


分配器,在stl里面一般不会调用new或者alloc来分配内存。
而且通过一个allocator对象的相关方法来分配(以及释放)。

这样做是为了能够自定义内存分配的行为,如果你不要自定义就用默认的。

#2


for(;;)
{
printf("Select: \n1-I know the length of two legs of a right triangle.\n");
printf("2-I know the length of the hypotenuse and a leg.\n?");
scanf("%u",&ch);
printf("What is the length of the longer side? \n?");
scanf("%f",&c);
printf("And the other? \n?");
scanf("%f",&d);
a=pow(c,2);
b=pow(d,2);  


if(ch==1)
{
d=sqrt(a+b);
printf("The hypotenuse is %f.\n",d);
break;
}
if(ch==2)
{
d=sqrt(a-b);
printf("The unknown leg is %f.\n",d);
break;
}
}
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
}
/* Distance Formula, a special application of Pythag. Theorem */
/* NAB 4-10-01.
NAB 4-27-01 Code Optmzd*/
if(sel==7)
{
printf("Enter the first X coordinate, then the first Y, then the second X coordinate, then the second Y.");
a=distance();
printf("The distance between is %f\n",a);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);

}
/* Equation for a Circle, another application of the Pythagorean Theorem */
/* The Fearless NAB 4-10-01 
NAB 4-27-01 Code Optmzd
NAB 6-14-01 Area Option Added */
if(sel==8)
{
printf("Enter the coordinates for the center of the circle, then the coordinates of a set of points on the circumfrence.");
a=distance();
b=pow(a,2)*pi;
printf("The length of the radius is %f.\nThe area of the circle is %f.\n",a,b);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);

}


/* Trig Functs - A function to output trig functions (sin,tan,cos) in degree, instead of the radians I get everywhere else :-) I guess Im just a degrees kinda guy! */
/* NAB 5-24-01 */    
if(sel==9)
{
for(;;)
{
printf("I know (choose best answer from the whole list):For an angle, the sides that are\n\t1-Opposite and Adjacent (Tangent)\n\t2-Adjacent and the Hypotenuse (Cosine)\n\t3-Opposite and Hypotenuse (Sine)\nI know an angle measure and the measure of the side that is, in relation to the angle:\n\t4-Opposite (s tan a)\n\t5-the Hypotenuse (s cos a and s sin a)\nRemember, the 90 degree angle is not included!!!\n?");
scanf("%u",&ch);
if(ch==1)
{
printf("Enter Opposite side length.\n?");
scanf("%f",&a);
printf("And the Adjacent side...\n?");
scanf("%f",&b);
c=(atan(a/b))*(180/pi);  
printf("Angle is %f degrees.\n",c);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
break;
}
if(ch==2)
{
printf("Enter Adjacent side length.\n?");
scanf("%f",&a);
printf("And the Hypotenuse...\n?");
scanf("%f",&b);
c=(acos(a/b))*(180/pi);  
printf("Angle is %f degrees.\n",c);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
break;
}
if(ch==3)
{
printf("Enter Opposite side length.\n?");
scanf("%f",&a);
printf("And the Hypotenuse...\n?");
scanf("%f",&b);
c=(asin(a/b))*(180/pi);  
printf("Angle is %f degrees.\n",c);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
break;
}
if(ch==4)
{
printf("Enter side opposite angle.\n?");
scanf("%f",&a);
printf("And the angle...\n?");
scanf("%f",&b);
b=b/(180/pi);
c=(a*tan(b));
printf("Adjacent side is %f degrees.\n",c);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
break;
}
if(ch==5)
{
printf("Enter hypotenuse.\n?");
scanf("%f",&a);
printf("And the angle...\n?");
scanf("%f",&b);
b=b/(180/pi);
c=(a*cos(b));
d=(a*sin(b));
printf("The side adjacent to the angle is %f, and the side opposite is %f.\n",c,d);
printf("Press Enter to Return to the Menu\n");
scanf("%c",&w);
scanf("%c",&w);
break;
}
}
}

#3


sorry,发错了,:P

#4


我也用了一次过,但是没有成功.可能还是语法上的问题 . 

有没有人可以给一个短小一点的例子. 用allocator的

#5


建议楼主去看jjhou的《SGI STL 源代码分析》

#6


不是很明白的楼主的意图

list <int> c2( 5, 2 ); 的语义是让 c2 有 5个 2 的意思

c5_Iter, c6_Iter 也是 list <int> 的迭代子,没有使用.


#7


如果是初学,可以不考虑allocator,一直使用默认值,

等你功力长进到一定的程度,再考虑,就不吃力了

#8


template<typename _InputIterator>
      list(_InputIterator __first, _InputIterator __last,
           const allocator_type& __a = allocator_type())

当你用:list <int> c6( c4.begin( ), c4_Iter, c2.get_allocator( ) );
时:
    allocator_type
    get_allocator() const { return _Base::get_allocator(); }
其实是一样的,就是你指定的值与默认值都是一样的.没什么很大的意义.除非你给出你自己不同于STL使用的分配器模型.

    typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type
            allocator_type;

#9


初学STL最好还是别看allocator了,先看看容器和算法怎么用了.

allocator不同的实现都不一样

#10


只要知道他是用来给容器进行内存管理的就行了.