2015-11-15 82 views
-5

Мне нужна помощь с этой программой. Я нахожусь в своем первом классе программирования и столкнулся с проблемой, пытаясь заставить мою программу работать. Я включил то, что я написал до сих пор, но все же он не компилируется. Указывает Ошибка:argument list for class template "std::vector" is missing. : Комментарий:отсутствует список аргументов для шаблона класса «std :: vector»

Здесь возникает вопрос: Когда вы читаете длинный документ, есть много шансов, что многие слова встречаются несколько раз. Вместо хранения каждого слова может быть полезно хранить только уникальные слова и представлять документ как вектор указателей на уникальные слова. Напишите программу, которая реализует эту стратегию. Прочитайте слово за раз от cin. Сохраните слова vector <char *>. Если новое слово отсутствует в этом векторе, выделите память, скопируйте в нее слово и добавьте указатель на новую память. Если слово уже присутствует, добавьте указатель на существующее слово.

Ниже фрагмент кода:

#include "stdafx.h" 
#include <string> 
#include <iostream> 
using namespace std; 

/* Create a vector of char pointers to hold the individual words. 
    Create a string input to hold the next input through cin. */ 

int main() { 
    vector words; 
    string input; 

    /* Keep the while loop running using cin as the condition to read an entire document. 
     This will end when a document has reached its end. */ 
    while (cin >> input) { 

    /* For every word read as a string, convert the word into a c-string by allocating 
     a new character array with the proper size and using c_str and strcpy to copy 
     an identical c-string into the memory heap. */ 
     char* temp = new char[input.length() + 1]; 
     strcpy(temp, input.c_str()); 

    /* Next, check if the word is already in the words array. Use a boolean variable 
     that updates if the word is found. Compare words by using the strcmp function; 
     when they are equal, strcmp equals 0. */ 
     bool already_present = false; 

     for (int i = 0; i < words.size(); i++) { 
      if (strcmp(temp, words[i]) == 0) { 
       already_present = true; 
      } 
     } 

    /* If the word is already present, delete the allocated memory. 
     Otherwise, push the pointer into the words vector. */ 
     if (already_present) { 
      delete temp; 
     } else { 
      words.push_back(temp); 
     } 
    } 
} 
+1

Возможно, вы имели в виду 'vector words;'? –

+1

Вы сделали 'include ' – therainmaker

+1

Вы понимаете, что такое шаблон? Какую книгу вы используете? –

ответ

0

Я надеюсь, что ниже фрагмент кода может быть полезным:

#include <string> 
#include <iostream> 
#include <string.h>  // String.h for strcmp() 
#include <vector>   // Vector Header file is added 
using namespace std; 

int main() { 
    vector <char *> words;  // vector of char * 
    string input; 

    while (cin >> input) { 
     char *temp = new char[input.length() + 1]; 
     strcpy(temp, input.c_str()); 

     bool already_present = false; 

     for (unsigned int i = 0; i < words.size(); i++) { 
      if (strcmp(temp, words[i]) == 0) { 
       already_present = true; 
      } 
     } 

     if (already_present) { 
      delete temp; 
     } else { 
      words.push_back(temp); 
     } 
    } 

    /* Print the desired output */ 
    for(unsigned int i=0; i<words.size(); i++) { 
     cout << words[i] << endl; 
    } 

    return 0; 
} 

Любые сомнения, комментарии приветствуются.

EDIT: После прочтения ваших комментариев я пришел к выводу, что вы используете Microsoft Visual Stdio. См., Причина, по которой вы получали предупреждение, заключается в том, что strcpy() потенциально опасен, потому что это может привести к переполнению буфера, если вы попытаетесь скопировать строку в буфер, который недостаточно велик, чтобы содержать его.

Рассмотрим фрагмент кода на данный момент:

char foo[10];  /* a buffer able to hold 9 chars (plus the null) */ 
char bar[] = "A string longer than 9 chars"; 

strcpy(foo, bar); /* compiles ok, but VERY BAD because you have a buffer overflow 
         and are corrupting memory. */ 

strcpy_s() является безопаснее, потому что вы должны явно указать размер целевого буфера, так что функция не будет переполнения:

strcpy_s(foo, 10, bar); /* strcpy_s will not write more than 10 characters */ 

Ограничения этого strcpy_s() заключается в том, что он нестандартен и специфичен для MS. Поэтому, если вы пишете код для его использования, ваш код больше не будет переноситься.

+0

использовал ваше предложение, но когда я скомпилирую, я получаю ошибку: Ошибка \t C4996 \t 'strcpy': Эта функция или переменная может быть небезопасной. Вместо этого рассмотрите возможность использования strcpy_s. Чтобы отключить устаревание, используйте _CRT_SECURE_NO_WARNINGS. – sanangelohorn

+0

Благодарим за помощь! Я использовал ваше предложение, но теперь я получаю сообщение об ошибке: – sanangelohorn

+0

@sanangelohorn Какая ошибка? – surajsn

Смежные вопросы