2012-01-20 17 views
6

Jestem skonstruowany na bardzo podstawowe pytanie. Chcę utworzyć dynamicznie tablicę ciągów w C++.tworzenie dynamicznej tablicy ciągów C++

Jak mogę to zrobić?

To moja próba:

#include <iostream> 
#include <string> 
int main(){ 
    unsigned int wordsCollection = 6; 
    unsigned int length = 6; 

    std::string *collection = new std::string[wordsCollection]; 
    for(unsigned int i = 0; i < wordsCollection; ++i){ 
     std::cin>>wordsCollection[i]; 
    } 
    return 0;  
} 

Ale daje następujący błąd

error C2109: subscript requires array or pointer type 

Co to jest błąd?

A jeśli otrzymam numer wejściowy od użytkownika, czy mogę utworzyć tablicę o tym rozmiarze statycznie?

+1

W przyszłości proszę wybrać blok kodu i użyć '{}' przycisk; to sprawi, że twój kod pojawi się poprawnie w pytaniu. –

+1

Napisałeś 'wordsCollection [i]' zamiast 'kolekcji [i]'. Nie można użyć rozmiaru uzyskanego * dynamicznie * (np. Przez 'std :: cin'), aby utworzyć statyczną tablicę. Również tablica jest nieszczelna, ponieważ nigdy jej nie wypuszczasz. –

Odpowiedz

9

Chciałeś wpisać:

std::cin>>collection[i]; 

I trzeba także delete[]collection (lub będziesz wyciek tej pamięci).

To byłoby lepsze wykorzystanie std::vector<std::string> collection; i uniknąć surowej wykorzystanie wskaźnika ogółem:

#include <iterator> 
#include <iostream> 
#include <string> 
#include <vector> 

int main() 
{ 
    const unsigned int wordsCollection = 6; 

    std::vector<std::string> collection; 
    std::string word; 
    for (unsigned int i = 0; i < wordsCollection; ++i) 
    { 
     std::cin >> word; 
     collection.push_back(word); 
    } 

    std::copy(collection.begin(), 
       collection.end(), 
       std::ostream_iterator<std::string>(std::cout, "\n")); 
} 
10

używać std::vector<string> lub std::list<string> przez strony toczenia go.

+2

Ale prawdziwy problem polega na tym, że 'wordsCollection' powinno być' kolekcji'. – cnicutar

+0

O mój Boże, jak głupi jestem ... Any jak dzięki ... możesz mi powiedzieć odpowiedź na moje drugie pytanie, które mogę utworzyć statyczną tablicę tego –

+1

Zgadzam się, ale jeśli zdecydujesz się iść z 'nowy std :: string' nie zapomnij o usunięciu kolekcji [] po zakończeniu. Dobrym pomysłem jest zapewnienie, że dla każdego 'nowego' masz' delete' –

0

Myślę, że to prosty błąd. std::cin>>wordsCollection[i] powinien być std::cin>>collection[i].

1

myślę, że powinno być:

std::cin >> collection[i]; 
0

Stajesz się ten błąd, ponieważ starasz dostęp elementy int (tj wordsCollection), a nie tablicą int (tj collection). Co powinno być pisanie jest

std::cin>>collection[i] 
0

Spróbuj wykonać następujące czynności:

#include <vector> 
#include <string> 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    std::vector<std::string> myStrings; 
    myStrings.push_back(std::string("string1")); 
    myStrings.push_back(std::string("string2")); 

    std::vector<std::string>::iterator iter = myStrings.begin(); 
    std::vector<std::string>::iterator end = myStrings.end(); 
    while(iter != end) 
    { 
     std::cout << (*iter) << std::endl; 
     ++iter; 
    } 
    return 0; 
} 
Powiązane problemy