C++ 通过引用传递向量字符指针

Posted

技术标签:

【中文标题】C++ 通过引用传递向量字符指针【英文标题】:C++ passing Vector character pointer by reference 【发布时间】:2012-02-24 16:44:15 【问题描述】:

大家好,我有以下问题,我需要从文件构建一个向量数组。 我设法通过将文件读入字符串缓冲区然后将其保存到以下向量中来创建向量。

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;

【问题讨论】:

你想把什么向量传递给那个函数?它需要一个指针的向量。 你的文件内容和patterns参数有什么关系?文件的每一行都应该是一个模式吗? 是的,文件中的每一行都是一个模式 我需要它来执行以下操作 【参考方案1】:

该函数正在查找 C 字符串的 vector(这是 const char * 在名为 patterns 的容器中的最可能含义。

您可以通过以下方式构建一个:

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

如果您或您的团队设计了此功能,您可能需要建议将容器类型更改为更 C++ - ish vector&lt;string&gt;

如果您从文件中读取模式,您可以按如下方式填充数组:

编辑(回应评论)

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()));

【讨论】:

@user1231229 您遇到什么错误?您是否包含所有必需的标题?你需要stringvectorfstreamiteratoralgorithm Test.cpp: In function 'int main(int, char**)': Test.cpp:16:11: error: 'istream_iterator' is not a member of 'std' Test.cpp :16:44: 错误: '>' 标记之前的预期主表达式 Test.cpp:16:52: 错误: 'istream_iterator' 不是'std' Test.cpp:16:85 的成员: 错误: 预期主- '>' 标记之前的表达式 Test.cpp:16:87: 错误:')' 标记之前的预期主表达式 @user1231229 您是否包含&lt;iterator&gt; 标头?这是声明std::istream_iterator 的地方。 感谢它编译,除了从文本文件中读取的空格之外的所有内容都被视为新行我希望将整行与其空格一起保存。 example (x y x) 一行/但它被保存 pattern[0] =x ,pattern[1] = y ,patter[2] = z ,我希望它是保存模式 [0] = x y z【参考方案2】:

如果contentsstd::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`

【讨论】:

他也可以使用vector&lt;char&gt; 来做到这一点,使用push_back(&amp;contents[0]),不需要string @BenVoigt 如果他可以直接将字符串放入向量中,那么将字符串放入向量然后将该向量放入另一个向量是没有意义的。 我从vector&lt;char&gt;的问题中想到了他。现在我发现这可能只是按照您的解释进行的失败尝试。【参考方案3】:

我不确定,但也许不是 void,而是将其设为向量并返回修改后的向量?

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

 //vector manupilations
 return patterns;

【讨论】:

以上是关于C++ 通过引用传递向量字符指针的主要内容,如果未能解决你的问题,请参考以下文章

C++:试图理解通过引用传递向量

如何使用 C++ 中的指针通过指针传递多维向量?

通过指针或引用将映射传递给函数?

C++:使用 int 指针指向在函数内部创建的向量

C ++将向量传递给函数:引用与指针,哪个是首选? [复制]

C++入门经典-例6.14-通过指针连接两个字符数组