Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 30.07.2023
Сообщений: 4

Кто хочет немного подумать над двухмерными массивами?

30.07.2023, 20:47. Показов 3533. Ответов 62

Студворк — интернет-сервис помощи студентам
В С++ мы знаем, что тип данных string - это массив состоящий из типа данных char. Но если сделать массив с типом данных string это будет считаться двухмерным массивом?

Эта мысля мне пришла ночью и я не смог таки уснуть думая над этим вопросом.

Вот вам пример такого массива:

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <string>
 
int main() {
 
    string a[3] = { "How", "are", "you?" };
 
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.07.2023, 20:47
Ответы с готовыми решениями:

Кто хорошо разбирается в accsess, прошу вас подумать над ниже описанным и отписаться
Долго думаю, не могу понять как это сделать, скоро голова поломается. Создаю программу в делфи и прицепляю базу. Есть таблицы продукты и...

Кто хочет поработать над мини-игрой?
Всем добрый день. Недавно решил написать мини-игру на php + javaScript в целях повышения уровня знаний в web программировании ну и какой...

Робота с двухмерными массивами
У нас есть двухмерный массив 10 на 10. И еще ми имеем одномерный массив (строку) - через которую вводим &quot;HelloWOrld&quot;. И ми...

62
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
30.07.2023, 21:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Royal_X Посмотреть сообщение
Однако к элементам твоего "массива" можно обращать так
Т.е. вы считаете, что элементы его массива имеют тип char? А разве элементы массива не должны иметь тот тип, который указан перед именем массива
Дело в том, что у string есть перегруженный оператор []
1
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,712
30.07.2023, 21:36
Байт, я не спорю, что так можно обращаться. Я писал о другом .
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
30.07.2023, 21:37
Если я не ошибаюсь... У QString точно есть.
0
30.07.2023, 21:39

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
То, что я говорил о type, а не о type alias.
Задачка попроще, какой type "перед именем массива" и какой тип его элементов в этом случае?
C++
1
int arr[4][4]
Цитата Сообщение от Royal_X Посмотреть сообщение
Я не согласен с вами, что string это type alias.
Но это и есть алиас для инстанса шаблона std::basic_string<char, ...>, ваше несогласие этого не изменит.

0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
30.07.2023, 21:43
Royal_X,
"Спокойствие, только спокойствие." Карлсон(С)
Я думаю что zayats80888, хочет сказать, что тип массива состоит не только из типа T, но и размер является так же частью типа любого массива.

Цитата Сообщение от Royal_X Посмотреть сообщение
в стандарте упоминается слово array и даже multidimensional array.
Специально для тебя :
Working Draft, Standard for Programming
Language C++


Document Number: N4885
Date: 2021-03-17
Revises: N4878
Reply to: Thomas Köppe
Google DeepMind
cxxeditor@gmail.com
9.3.4.5 Arrays
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,712
30.07.2023, 21:52
zayats80888, basic_string это class template, а не type. Соответственно, string не может быть type alias, впрочем вы и сами с этим согласились, когда написали "для инстанса шаблонов".
Теперь объясните, какое отношение имеет к теме ваш тот пример с type alias?

Добавлено через 1 минуту
SmallEvil, да, значит правильно предполагал, что массивы есть в стандарте.

Добавлено через 1 минуту
zayats80888, я спорить не хочу. Но никогда не соглашусь с тем, что string это кличка/синоним для символьного массива.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
30.07.2023, 21:53
Цитата Сообщение от Royal_X Посмотреть сообщение
Теперь объясните, какое отношение имеет к теме ваш тот пример с type alias?
Из того же раздела приведенного мной выше :
5 Any type of the form “cv-qualifier-seq array of N U” is adjusted to “array of N cv-qualifier-seq U”, and similarly
for “array of unknown bound of U”.
[Example 2 :
typedef int A[5], AA[2][3];
typedef const A CA; // type is “array of 5 const int”
typedef const AA CAA; // type is “array of 2 array of 3 const int”
—end example]


Добавлено через 24 секунды
Цитата Сообщение от Royal_X Посмотреть сообщение
Но никогда не соглашусь с тем, что string это кличка для символьного массива
Никто так не говорил.
0
30.07.2023, 21:53

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
Соответственно, string не может быть type alias, впрочем вы и сами с этим согласились, когда написали "для инстанса шаблонов".
Где это я согласился? С каких пор инстанс шаблона не является типом?
Цитата Сообщение от Royal_X Посмотреть сообщение
Теперь объясните, какое отношение имеет к теме ваш тот пример с type alias?
К теме никакого, наверное поэтому я помещаю свои посты в теги "не потеме", в отличие от...
А вот к тому, что я процитировал - непосредственное.
Вы так ни на один вопрос не ответили, все извиваетесь, как уж на сковороде :)

0
30.07.2023, 21:55

Не по теме:

Цитата Сообщение от SmallEvil
Никто так не говорил.
Значит, я неправильно понял позицию zayats80888. Прошу меня простить :pardon:
Цитата Сообщение от zayats80888
Вы так ни на один вопрос не ответили, все извиваетесь, как уж на сковороде :)
Был бы на поле чудес, то вращал бы барабан и отвечал бы на все вопросы не по теме. Но ваш вопрос был задан на вопрос, поэтому я ценю мудрость Соломона, но отвечать не хочу, буду дальше на сковороде...

0
 Аватар для Наталья8
638 / 396 / 67
Регистрация: 09.03.2016
Сообщений: 4,343
31.07.2023, 02:04
Легко привинчу к string, указатель char.
И нет разницы ни какой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main() {
    std::string a[3] = { "How", "hello", "you?" };
const char *one = a[1].c_str();
    std::printf("strlen(hello)=%d\n", strlen(one));
    int ptr(0);
// Вторая наоборот    
    const char *next_ptr = one + strlen(one);
while ((next_ptr - ptr++) != one)std::printf("%c", *(next_ptr - ptr));
            
        std::getchar();
    return 0;
}
Сгодиться как двумерный массив char.
0
 Аватар для Наталья8
638 / 396 / 67
Регистрация: 09.03.2016
Сообщений: 4,343
31.07.2023, 02:09
Название: NewPicture21 (2).png
Просмотров: 118

Размер: 9.0 Кб
0
184 / 72 / 35
Регистрация: 09.05.2022
Сообщений: 388
31.07.2023, 02:18
Нет, в C++ массив строк string a[3] в твоем примере не двумерный массив.
Хотя string представляет собой массив символов типа char, массив строк string a[3] не двумерный массив. В данном случае это просто одномерный массив из трех элементов типа string, и каждый элемент этого массива содержит строку.

Двумерный массив - это массив, в котором элементы представляют собой другие массивы, формируя сетку или таблицу. Например:
C++
1
2
3
int arr[3][3] = { {1, 2, 3},
                 {4, 5, 6},
                 {7, 8, 9} };
В этом примере arr является двумерным массивом, состоящим из 3 строк и 3 столбцов. А в твоем случае string a[3] - это просто одномерный массив строк, где каждый элемент a[i] - это отдельная строка, а не массив символов.
0
 Аватар для Наталья8
638 / 396 / 67
Регистрация: 09.03.2016
Сообщений: 4,343
31.07.2023, 03:48
Я вам немного подумал....

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <iomanip>//  setw
#include <string>
 
int main() {
    const int count(6);
std::string a[count] = {
        "How",
        "hello",
        "you?",
        "revolution",
        "ejaculation",
        "intelligence" };
 
//Вывод посимвольно. Индентично как двумерный массив char....   
    for (int i = 0; i < count; ++i){
        std::cout << "\t";
        for (int j = 0; j < strlen(a[i].c_str()); ++j)
            std::printf("%c", *(a[i].c_str() + j));
            std::cout << "\n";
    }
std::getchar();
    return 0;
}
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,712
31.07.2023, 09:51
То, что к символам string можно обращаться по индексу, ещё не делает массивом char.

Ведь, в примере
C++
1
auto s = "apple";
я могу обращаться к символам по индексу. Например, напишу s[0] и получу символ 'a'. Но является ли s массивом символов? НЕТ!
Под auto там скрывается const char*.
Т.е. выше, по сути, я писал:
C++
1
const char* s = "apple";
Вы же не станете утверждать, что указатель = массив ?

А вот C-style string можно назвать массивом char.
Например,
C++
1
char s[] = "abc";
это не что иное, что массив char:
C++
1
char s[] = {'a','b','c','\0'};
Кстати, если проверить с помощью typeid(s).name(), то и в первом и во втором случаях я получаю A4_c, что означает массив из 4 char. Вы можете получить другой вывод, т.к. typeid().name не стандартизирована и зависит от реализации. Но суть будет та же.

А вот, что такое string написано в документации:
The class template basic_string stores and manipulates sequences of char-like objects, which are non-array objects of trivial standard-layout type.
1
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
31.07.2023, 13:28
Цитата Сообщение от karlhildekruger Посмотреть сообщение
Хотя string представляет собой массив символов типа char
Бред.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.08.2023, 10:58
Цитата Сообщение от Royal_X Посмотреть сообщение
То, что к символам string можно обращаться по индексу, ещё не делает массивом char.
А std::array<T, size_t> https://en.cppreference.com/w/cpp/container/array
это array или не array ?
std::string это basic_string специализированный на типе char и его свойствах независимо от платформы. https://en.cppreference.com/w/... sic_string
и внутри оно содержит массив (неизменяемый только) :
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <string>
int main()
{
    std::string str="str";
    const//закоментите const и получите ошибку
    char *pchar=str.data();
    std::cout<<pchar[0];//s
 
    return 0;
}
При вызове оператора индексации, о котором сказал уважаемый (и любимый мною) Байт, происходит обращение к константному указателю с этим же оператором.
То есть, если учесть оговорки о том, что массив константный и зубчатый (допускает разную размерность по строкам), то да, std::string<string> может рассматриваться как 2-d массив. Но на резином ходу, с кондиционером и подстаканником. Чтобы не нюхать из банки)
2
 Аватар для Наталья8
638 / 396 / 67
Регистрация: 09.03.2016
Сообщений: 4,343
01.08.2023, 11:23
Цитата Сообщение от IGPIGP Посмотреть сообщение
Чтобы не нюхать
-----------------------

Добавлено через 8 минут
Люди деляться на две категории.
Те кто называют эту беду массивом char,
или строками string.
А я вот так писал. И работает...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
std::string line;
std::ifstream fin(buf);
    if (fin.is_open()){
while (getline(fin, line))// =============== Читаем текст =============== && (int)line[n - 1] == 208
{
    bool repeat(false);
        //------------------------------
        char *cut_ptr = &line[0];
        if (*(cut_ptr + 4) == '-' && *(cut_ptr + 35) == '.' && *(cut_ptr + 40) == '0' && *(cut_ptr + 43) == ' ')
        {//Определяем строчку с датой
            data = L"";
            std::wstring wsTmp(line.begin(), line.end());
            for (int i = 33; i < 43; ++i)data += wsTmp[i];
            data += L"  ";
        }
        else {
            //------------------------------ 
while (((cut_ptr = strchr(cut_ptr, 'h')) == NULL || *(cut_ptr + 1) != 't' || *(cut_ptr + 3) != 'p' || *(cut_ptr + 6) != '/'))
            {
                if (cut_ptr == NULL){ cut_ptr = &line[0] + strlen(line.c_str()); break; }
                ++cut_ptr;
            }
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6331 / 3063 / 1054
Регистрация: 01.06.2021
Сообщений: 11,712
01.08.2023, 11:28
IGPIGP, это только начиная с С++11 (basic_string general requirements [string.require], 21.4.1.5)
The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string object s, the identity &*(s.begin() + n) == &*s.begin() + n shall hold for all values of n such that 0 <= n < s.size().
А раньше значит такого требования даже не было.
0
 Аватар для Наталья8
638 / 396 / 67
Регистрация: 09.03.2016
Сообщений: 4,343
01.08.2023, 11:44
Цитата Сообщение от Наталья8 Посмотреть сообщение
А я вот так писал
Мне кажеться, указателем будет быстрее, чем ковырять методами класса string.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.08.2023, 12:02
Цитата Сообщение от IGPIGP Посмотреть сообщение
может рассматриваться как 2-d массив
Много чего можно рассматривать "как", но это не будет "тем самым".
Все дело в постановке вопроса. В данной теме вопрос не вызывает никаких двусмысленностей.
std::map<int, std::map<int, char>> тоже можно рассматривать "как" массив.
Опять от вас философия ни о чем, не имеющая к вопросу отношения.
std::map IS an array ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <map>
int main()
{
    std::map<int, std::map<int, char>> arr{
        {0,{{0,'a'},{1,'b'},{2,'c'}}},
        {1,{{0,'a'},{1,'s'},{2,'d'}}},
        {2,{{0,'w'},{1,'t'},{2,'f'}}},
    };
    for(int i = 0; i != arr.size(); ++i){
        for(int j = 0; j != arr[0].size(); ++j)
            std::cout << arr[i][j] << ' ';
        std::cout << std::endl;
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.08.2023, 12:02

Работа с двухмерными массивами
Есть задание заменить каждый элемент столюца массива произведением последующих элементов этого столбца. может ктото подскажет как это...

Работа с двухмерными массивами
Дана матрица вещественных чисел размером N на M. Вычислить произведение отрицательных элементов последнего столбца.

Работа с двухмерными массивами
Дана матрица. Нужно сделать так, что бы столбцы расставились в порядке убывания первых элементов import numpy as np ...

Работа с двухмерными массивами
Привет всем. Помогите пожалуйста. Нужно в двухмерном массиве 10х10 переставить столбцы в порядке увеличения количества элеменов=0 в...

Работа с двухмерными массивами
Даны три задания: 1) Дано матрицу размером 5 x 10. В каждом столбце найти количество элементов, больших среднего арифметического всех...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru