Стандартные классы
Составными типами данных в С являются только массивы и структуры.
В С++ можно использовать "из коробки"
ассоциативные массивы, множества, списки, стеки, очереди и т.д.
Размер массива в C указывается при создании и далее его нельзя изменить.
Для выполнения операций над массивами нужно писать явно циклы.
В С++ можно использовать типы vector и valarray:
int a[100]; //
vector<int> a(100); //
vector<int> c(10,-1); //
vector<double> b{1,2.5,6}; //
a.resize(50); //
c.resize(100,1); //
a[2]=c[51]; //
cout<<a.size(); //
...
valarray<double> a1(100),a2(100),a3(100);
a3=a1+a2; //
Строки являются обычными массивами и для манипуляции необходимо
использовать последовательность вызовов функций. В C++ действия
со строками становятся проще:
char s1[100],s2[100],s3[200]; //
strcpy(s3,s1); //
strcat(s3,s2);
...
string s1,s2,s3;
s3=s1+s2; //
Чтобы отличить строковые константы С++ от констант C, имеющих тип
const char*, к ним можно добавить суффикс
s:
"Text"s
В С++ появилась новая разновидность цикла
for:
for(
объявление переменной:
контейнер)
оператор
превращается в
{
auto &&r=контейнер;
for(auto b=begin(r), e=end(r); b!=e; ++b)
{ объявление переменной=*b;
оператор
}
}
где begin(r) – перегруженная функция, которая возвращает начальный адрес массива или результат вызова метода r.begin() для контейнерных классов, а end(r) – конечный адрес массива или результат вызова метода r.end() для контейнерных классов.
vector<int> v;
for(auto &x: v) x*=2; //
int m[4];
for(int &e: m) cin>>e; //
for(auto a:{2,3,5,7}) cout<<a<<"\n"; //
Для цикла по контейнеру map, который возвращает pair, можно использовать декомпозицию при объявлении:
map<string,int> a{{"a",1},{"bc",5},{"xyz",7}};
for(auto [key,val]:a) cout<<key<<" "<<val<<"\n";