Loading...
Jovanna avatar Jovanna 186 Точки

*stringPointer , принт като char и като string - кога, как?

Здравейте,

защо в двата случая разбира различно значение на *strP ?  в случай 1 принти char-овете на първия стринг (само),

а в случай 2:  записаните 4 стринга:

#include <iostream>
#include <string>

int main()
{
    std::string * strP = new std::string[4]();
    std::string s = "Nemo";
    for (int i = 0; i < 4; i++)
    {
        strP[i] = s;
        s += s;
    }

//CASE 1:
    std::cout << "AUTO ITERATOR - iterator to char  ?:" << std::endl;      
    for (auto it = strP->begin(); it != strP->end(); it++)
    {
        std::cout << *it << ", ";
    }
    std::cout << std::endl;

//CASE 2:
    std::cout << "FOR LOOP:" << std::endl;
    for (int i = 0; i < 3; i++)
    {
        std::cout << strP[i] << ", ";
    }
    std::cout << strP[3] << std::endl;

delete[] strP ;
    return 0;
}

Тагове:
0
C++ Fundamentals
Dimitar_Petkov_Petkov avatar Dimitar_Petkov_Petkov 169 Точки

Здравей,

според мен причината CASE1 да итерира символите само на първия от низовете е, че твоят масив е от null terminated C style низове и strP->end() сочи точно към '\0'  на първия низ, който е "Name". По-общо казано масивите и указателите не са една и също животно, макар понякога масивите се свеждат до указатели. Масивът има фиксирана дължина в  паметта, указателят - не, той просто посочва клетка от нея. При CASE2 знаейки размера на масива, който всъщност "jagged" или "назъбен" се принтира всеки един низ. Като в конкретния случай може да го напишем и така *(strP + i).

1
kolioi avatar kolioi 641 Точки

strP е масив от 4 string-а, a името на масива е пойнтер към първия елемент от масива. В първия цикъл просто печаташ първия стринг като използваш итератори. Втория стринг може да отпечаташ така

for (auto it = (strP+1)->begin(); it != (strP+1)->end(); it++)

или така

for (auto it = (&strP[1])->begin(); it != (&strP[1])->end(); it++)

Втория цикъл печата всиички елементи от масива.

Масивите, дефинирани по този начин (независимо дали са в стека или хийпа), нямат дефинирани begin, end, iterator, operator ++ и т.н. за разлика от string и STL контейнерите. Не знам от къде е тази програмка, но тук са смесени C и C++. Аз бих използвал vector или array вместо масив от 4 string-а (който може просто да се дефинира в стека като std::string strP[4];).

Та отговора на въпроса защо първия цикъл печата символите на първия стринг, а втория цикъл печата всички стрингове в масива е, че масива strP, дефиниран по този начин, не поддържа итератори. Ако strP беше vector или array, тогава първия цикъл щеше да работи като втория и да печата всички стрингове в масива.

2
04/07/2018 08:02:19
Jovanna avatar Jovanna 186 Точки

Благодаря! Сега вече е ясно, много благодаря. Иначе, кодът е авторски ))) доста ми отне да дебъгвам в една програмка, като бях се престарала с итераторите,...и масивите :-)

Поздрави!

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.