C ++ передает указатель векторного символа по ссылке - PullRequest
1 голос
/ 24 февраля 2012

Привет всем, у меня есть следующая проблема, мне нужно построить векторный массив из файла.Мне удалось создать вектор, прочитав файл в строковом буфере и сохранив его в следующем векторе.

vector<char> pattern(contents.begin(), contents.end());

Но у меня есть следующая функция, которой нужно передать вектор.

void WuManber::Initialize( const vector<const char *> &patterns, 
                      bool bCaseSensitive, bool bIncludeSpecialCharacters, bool bIncludeExtendedAscii )

как я могу прочитать из файла проходимый вектор для этой функции.спасибо за вашу помощь.

чтобы уточнить, мне нужно сделать следующее

for ( size_t q = m; q >= B; --q ) 
  { // start loop -8-

  unsigned int hash;
  hash  = m_lu[patterns[j][q - 2 - 1]].offset; // bring in offsets of X in pattern j
  hash <<= m_nBitsInShift;
  hash += m_lu[patterns[j][q - 1 - 1]].offset;
  hash <<= m_nBitsInShift;
  hash += m_lu[patterns[j][q     - 1]].offset;
  size_t shiftlen = m - q;
  m_ShiftTable[ hash ] = min( m_ShiftTable[ hash ], shiftlen );
  if ( 0 == shiftlen ) 
 {  // start if -8-
    m_PatternMapElement.ix = j;
    m_PatternMapElement.PrefixHash = m_lu[patterns[j][0]].offset;
    m_PatternMapElement.PrefixHash <<= m_nBitsInShift;
    m_PatternMapElement.PrefixHash += m_lu[patterns[j][1]].offset;
    m_vPatternMap[ hash ].push_back( m_PatternMapElement );
  } // end if -8-

int main(int argc, char* argv[])
{
if (argc < 2) {
  std::cout << "usage: " << argv[0] << " <filename>\n";
  return 2;
 }

 ifstream fin(argv[1]);
 if (fin) {
  stringstream ss;
  // this copies the entire contents of the file into the string stream
  ss << fin.rdbuf();
  // get the string out of the string stream
  string contents = ss.str();
  cout << contents;
  // construct the vector from the string.
  vector<char> pattern(contents.begin(), contents.end());
  Initialize( &pattern);
  cout << pattern.size();
 }
 else {
  cout << "Couldn't open " << argv[1] << "\n";
  return 1;
 }
 return 0;
}

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Функция ищет vector строк C (это наиболее вероятное значение const char * внутри контейнера с именем patterns.

. Вот как вы можете его создать:

std::vector<const char*> patterns;
patterns.push_back("my-first-pattern");
patterns.push_back("my-second-pattern");

Если вы или ваша команда разработали эту функцию, вы можете предложить изменить тип контейнера на более C ++ - ish vector<string>.

Если вы читаете свои шаблоны из файла,Вы можете заполнить свой массив следующим образом:

РЕДАКТИРОВАТЬ (в ответ на комментарий)

std::ifstream ifs("file_with_patterns.txt");
std::vector<const char*> patterns;
while (!ifs.eof()) {
    std::string buf;
    std::getline(ifs, buf);
    patterns.push_back(strdup(buf.c_str()));
}
1 голос
/ 24 февраля 2012

Если contents является std::string, вы можете сохранить указатель на данные string внутри вектора и передать его функции:

vector<const char*> patterns;
patterns.push_back(contents.c_str());

// then pass patterns to Initialise

Initialise(patterns, bool, bool, bool);

// make sure you do not try to use `patterns` after you have changed `contents`
0 голосов
/ 24 февраля 2012

Я не уверен, но может вместо void сделать его вектором и вернуть измененный вектор обратно?

vector<char> WuManber::Initialize(const vector<const char *> &patterns, bool bCaseSensitive, bool bIncludeSpecialCharacters, bool bIncludeExtendedAscii ) 
{
 //vector manupilations
 return patterns;
}
...