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

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

30.07.2023, 20:47. Показов 3247. Ответов 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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,525
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,525
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
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
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
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
31.07.2023, 02:09
Название: NewPicture21 (2).png
Просмотров: 116

Размер: 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
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,525
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
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,525
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
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
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
Ответ Создать тему
Новые блоги и статьи
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru