Как распечатать вектор указателей на структуру в C ++? - PullRequest
0 голосов
/ 02 июня 2019

хочу вывести вектор указателей на структуру в c ++.Я пытался использовать функции begin () и end (), но он не работает

struct Word
{
char * data;
int count =1;
Word ( char * data_ ) :
data( ::strdup(data_) )
{
}

Word () :
    data((char *)"")
    {
    }
};
static std::vector<Word*> s_wordsArray;
static Word s_word;

int main(){
s_word.data = new char(10);
Word * w = new Word(s_word);
strcpy(s_word.data, "Hello");
for(int i=0;i<5;i++){
    s_wordsArray.push_back(w);    
}

vector<Word*>::iterator it;
for (it = s_wordsArray.begin(); it != s_wordsArray.end(); it++)
    cout << *it->data << " "<<"\n";
}

Я получаю ошибку компиляции.main.cpp: 44: 22: ошибка: запрос элемента 'data' в '* it .__ gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: operator->> ()', который имеет тип указателя 'Word *' (может быть, вы хотели использовать '->'?) cout << (it-> data) << "" << "\ n"; </p>

1 Ответ

0 голосов
/ 02 июня 2019

в последней строке, вам нужно форсировать порядок оценки, используя (* it) -> data вместо просто * it-> data. Как упомянул Джордж, приоритет оператора работает против вас.

Кстати, у меня было бы 3 дополнительных замечания:

1) если пространство для вашего поля данных выделено через strdup (), это означает, что оно выделено функцией malloc (). Следовательно, он должен быть позже освобожден функцией free (). И вам не следует пытаться использовать new () для некоторых объектов Word и malloc () для других.

2) в конечном счете, вы можете захотеть работать с правильными объектами C ++ std :: string, а не с символьными строками в стиле C, заканчивающимися NUL.

3) вам гораздо труднее помочь, если вы не используете достаточно пустого пространства для ясности и если вы не делаете отступ в коде должным образом. Пожалуйста, ознакомьтесь с приведенными ниже ссылками.

https://www.cprogramming.com/tutorial/style.html

https://www.learncpp.com/cpp-tutorial/whitespace-and-basic-formatting/

Полное руководство и список книг C ++

#include  <vector>
#include  <iostream>
#include  <cstring>


struct Word
{
    char*   data;

    Word(const char* data_) : data(strdup(data_))
    {
    }

    Word() : Word("")
    {
        // default constructor delegated to main one
    }

    ~Word()  // destructor
    {
        free(this->data);
    }
};


static  std::vector<Word*>  s_wordsArray;


int main()
{
    Word*     w = new Word("Hello");

    for(int i=0 ; i<5 ; i++) {
        s_wordsArray.push_back(w);    
    }

    //--std::vector<Word*>::iterator it;  // not required, see line below
    for (auto it = s_wordsArray.begin(); it != s_wordsArray.end(); it++)
        std::cout << (*it)->data << " " << "\n";   // mind parenthesis !!!

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...