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

C++ C++;通过引用传递向量字符指针,c++,reference,vector,chat,constants,C++,Reference,Vector,Chat,Constants,大家好,我有以下问题,我需要从一个文件构建一个向量数组。 通过将文件读入字符串缓冲区,然后将其保存到下面的向量中,我成功地创建了一个向量 vector<char> pattern(contents.begin(), contents.end()); 向量模式(contents.begin(),contents.end()); 但是我有一个函数,我需要把向量传递给它 void WuManber::Initialize( const vector<const char *>

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

vector<char> pattern(contents.begin(), contents.end());
向量模式(contents.begin(),contents.end()); 但是我有一个函数,我需要把向量传递给它

void WuManber::Initialize( const vector<const char *> &patterns, 
                      bool bCaseSensitive, bool bIncludeSpecialCharacters, bool bIncludeExtendedAscii )
void WuManber::初始化(常量向量和模式,
bool bCaseSensitive,bool bincludespecial characters,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;
}
(尺寸q=m;q>=B;--q)的

{//开始循环-8-
无符号整数散列;
hash=m_lu[patterns[j][q-2-1]].offset;//在模式j中引入X的偏移量

哈希如果
contents
std::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`
向量模式;
patterns.push_back(contents.c_str());
//然后传递模式进行初始化
初始化(模式、布尔、布尔、布尔);
//确保在更改“内容”后不要尝试使用“模式”`

我不确定,但可能不是void,而是将其设置为向量并返回修改后的向量

vector<char> WuManber::Initialize(const vector<const char *> &patterns, bool bCaseSensitive, bool bIncludeSpecialCharacters, bool bIncludeExtendedAscii ) 
{
 //vector manupilations
 return patterns;
}
vector WuManber::Initialize(常量向量和模式、bool bCaseSensitive、bool bIncludeSpecialCharacters、bool bincludedextendedascii)
{
//媒介制造
返回模式;
}

函数正在查找C字符串的
向量(这是名为
patterns
的容器中
常量char*
最可能的含义)

以下是如何构建一个:

std::vector<const char*> patterns;
patterns.push_back("my-first-pattern");
patterns.push_back("my-second-pattern");
std::向量模式;
模式。向后推(“我的第一个模式”);
模式。向后推(“我的第二个模式”);

如果您或您的团队设计了这个函数,您可能建议将容器类型更改为更多的C++ + ISH <代码>向量< /代码>。 如果从文件中读取模式,则可以按如下方式填充阵列:

编辑(回应评论)

std::ifstream ifs(“file_with_patterns.txt”);
std::向量模式;
而(!ifs.eof()){
std::字符串buf;
标准::getline(ifs,buf);
模式。推回(strdup(buf.c_str());
}

您希望传递给该函数的向量是什么?它需要一个指针向量。文件内容与patterns参数的关系如何?文件的每一行是否都应该是一个模式?是的,文件中的每一行都是一个模式我需要它来执行以下操作我有一个大型模式文件,我必须从中创建哈希表因此,如果我没有通过引用传递它,那将是浪费。他也可以使用
向量
来传递,使用
推回(&contents[0])
,不需要
字符串
@BenVoigt当他可以直接将字符串放入向量时,将字符串放入向量然后将向量放入另一个向量是毫无意义的。我从问题中想到,他在
向量
中遇到了字符串。现在我明白了,这可能是一次失败的尝试lained@user1231229您得到的错误是什么?您包括了所有必需的标题吗?您需要
字符串
向量
迭代器
,和
算法
。Test.cpp:在函数“int main”(int,char**)中':Test.cpp:16:11:error:'istream\u iterator'不是'std'测试的成员。cpp:16:44:error:在'>'标记测试之前应为主表达式。cpp:16:52:error:'istream\u iterator'不是'std'测试的成员。cpp:16:85:error:在'>'标记测试之前应为主表达式。cpp:16:87:error:应为主表达式在“)”之前token@user1231229是否包含
标题?这是声明
std::istream\u迭代器的位置。谢谢您,它已编译,除了从文本文件读取的空格以外的所有内容都被视为新行。我希望整行与其空格一起保存。示例(x y x)一行/但它已保存模式[0]=x,模式[1]=y,模式[2]=z,我希望它是保存模式[0]=x y z
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()));
}