Обход вложенных векторов строк - PullRequest
2 голосов
/ 06 января 2011

В моем коде проблема с вложенными векторами строк. Это не печать строк.

void foo(vector<vector<char const *> > const & vcp){
   vector<vector<char const *> >::const_iterator i(vcp.begin());
   vector<vector<char const *> >::const_iterator e(vcp.end());

   for(; i != e; ++i){
      vector<char const *>::const_iterator ci(i->begin());
      vector<char const *>::const_iterator ce(i->end());
      for(; ci != ce; ++ci) 
         cout<<*ci<<endl; //Not printing
   } 
}

int main(){
  std::vector<vector<char const *> > vvcp(3);
  std::vector<char const *> vcp(3);
  vcp.push_back(string("abcd").c_str());
  vcp.push_back(string("efgh").c_str());
  vcp.push_back(string("ijkl").c_str());

  vvcp.push_back(vcp);
  vvcp.push_back(vcp);
  foo(vvcp);
  return EXIT_SUCCESS;
}

Ответы [ 2 ]

6 голосов
/ 06 января 2011

Это не имеет ничего общего с векторами.

Вы создаете временных std::string объектов, получаете указатели на их базовые данные и пытаетесь использовать эти указатели после того, как строки больше не существуют . Это не разрешено.

(Кроме того, подача '* x' в std :: cout, где 'x' - это символьная константа *, будет печатать только первый символ C-строки.)

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

1 голос
/ 06 января 2011

Я подтверждаю @Karl. Измените свой код в C стиле :

vcp.push_back("abcd");
vcp.push_back("efgh");
vcp.push_back("ijkl");
...