printУлучшения языка C

printСтандартные классы

Составными типами данных в С являются только массивы и структуры. В С++ можно использовать "из коробки" ассоциативные массивы, множества, списки, стеки, очереди и т.д.
Размер массива в C указывается при создании и далее его нельзя изменить. Для выполнения операций над массивами нужно писать явно циклы. В С++ можно использовать типы vector и valarray:
int a[100]; // обычный массив - фиксированный размер
vector<int> a(100); // улучшенный массив в С++
vector<int> c(10,-1); // можно указать размер и начальное значение для всех элементов
vector<double> b{1,2.5,6}; // задание массива через перечисление: double b[]={1,2.5,6};
a.resize(50); // изменение размера
c.resize(100,1); // изменение размера, все новые элементы получают значение 1
a[2]=c[51]; // доступ к элементам
cout<<a.size(); // текущий размер
...
valarray<double> a1(100),a2(100),a3(100);
a3=a1+a2; // сложение 2 векторов
Строки являются обычными массивами и для манипуляции необходимо использовать последовательность вызовов функций. В 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; // удвоить элементы вектора v
int m[4];
for(int &e: m) cin>>e; // ввод массива m
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";
loading