C ++ не поддерживает копирование или сравнение массивов в стиле C, но он поддерживает такие операции с очень тонкими массивами в стиле C. Попробуйте boost::array
, что совпадает с tr1::array
и std::array
в C ++ 0x.
Или сверните свое собственное:
#include <algorithm>
template< class T, size_t s >
struct array {
T arr[s]; // public data, no destructor, inheritance, virtuals, etc
// => type is aggregate
operator T const *() const { return arr; }
operator T *() { return arr; } // as close as we can get to array emulation
friend bool operator< ( array const &l, array const &r )
{ return std::lexicographical_compare( l, l+s, r, r+s ); }
};
array< char, 10 > names[] // aggregate initialization — this is standard C++
= { "JOHN", "PETER", "ARNOLD", "JACK" };
#include <iostream>
using namespace std;
int main() {
sort( names, names + sizeof names / sizeof *names );
for ( array<char,10> *s = names; s != names + sizeof names/sizeof*names; ++ s )
cerr << *s << endl;
}
Если ваш компилятор не добавляет в указанную структуру дополнения безумно, вы можете безопасно reinterpret_cast
массив в стиле C и array
:
template< class T, size_t s >
array< T, s > &wrap_arr( T (&a)[s] ) {
return reinterpret_cast< array<T,s> & >( a );
// make sure the compiler isn't really wacky...
// I would call this optional:
BOOST_STATIC_ASSERT( sizeof( T[s] ) == sizeof( array<T,s> ) );
}
char names_c[][10] // or whatever C input from wherever
= { "JOHN", "PETER", "ARNOLD", "JACK" };
array<char, 10> *names = &wrap_arr( names_c[0] );