【问题标题】:Declaring a vector of pointers to vector of strings声明一个指向字符串向量的指针向量
【发布时间】:2011-10-12 03:27:18
【问题描述】:

我有一个二维字符串表(使用 STL 向量),我正在尝试修改,以便该表是指向字符串向量的指针向量。我知道这将需要更改构造函数以便动态创建行,并将指向行的指针插入到表中,但我不确定如何首先创建此表。

在我的 .h 文件中:

class StringTable
{
public:

    StringTable(ifstream & infile);

    // 'rows' returns the number of rows
    int rows() const;

    // operator [] returns row at index 'i';
    const vector<string> & operator[](int i) const;

private:
    vector<vector<string> >  table;

};

在我的 .cpp 文件中:

StringTable::StringTable(ifstream & infile)
{
    string          s;
    vector<string>  row;

    while (readMultiWord(s, infile))  // not end of file
    {
        row.clear();
        do
        {
            row.push_back(s);
        }
        while (readMultiWord(s, infile));
        table.push_back(row);
    }
}

int StringTable::rows() const
{
    return table.size();
}

const vector<string> & StringTable::operator[](int i) const
{
    return table[i];
}

我觉得这可能是一个非常简单的转换,但我没有很多使用向量的经验,我不知道从哪里开始。非常感谢任何指导!

【问题讨论】:

  • 为什么需要一个指针向量?这听起来是个糟糕的主意。
  • @BrendanLong 这是 C/C++!
  • 为什么while (readMultiWord(s, infile)) 中有一个while (readMultiWord(s, infile))?它是在行尾返回false 还是什么?
  • @muntoo 是的,它从一个表中读取字符串,其中每个字段由 s 分隔。当程序读入一个单词时,它会推回 s,然后当它到达行尾时,它会推入该行的单词。

标签: c++ class pointers vector stdvector


【解决方案1】:

您似乎正在尝试创建某种形式的多维向量。你考虑过使用boost吗? http://www.boost.org/doc/libs/1_47_0/libs/multi_array/doc/user.html

【讨论】:

  • 如果您真的想自己动手,Meyers 的 Effective C++ 涵盖了这个确切的场景。 TLDR:与其用 operator[] 破解东西,不如创建一个函数“string getElement(int row, int col)”和“setElement(int row, int col, const string &value);”
【解决方案2】:

确定最简单的方法是使用 typedef。此外,您似乎在头文件中使用了“使用”子句 - 您永远不应该这样做。

class StringTable
{
    public:
         typedef std::vector<std::string> Strings_t;
         std::vector<Strings_t *> table;
};

不要忘记现在添加时需要分配内存,即:

StringTable tbl;
StringTable::Strings_t *data_ptr=new StringTable::Strings_t;

data_ptr->push_back("foo");
data_ptr->push_back("bar");

tbl.table.push_back(data_ptr);

[更正]

【讨论】:

  • typedef 如何使这一点更清楚?即使在你的微不足道的例子中,它也会导致问题(Strings_t vs String_t)。
  • 是的,@Paul,不要在你的头文件中使用using namespace std;...实际上,我不会在任何地方使用它。
  • @Brendan - a) 我应该编译的(String_t vs Strings_t)是一个错字,我也忘记了类命名空间
  • 你为什么使用new?那只是要求内存泄漏。如果您真的想无缘无故地使用指针,请修复此行 tbl.table.push_back(&amp;data_ptr); 并使用 delete dataptr;
  • 使用 new 非常好 - 它不会要求内存泄漏 - 它是一个巨大的性能提升。请不要因为害怕而避免使用语言功能 - 正确使用它们并且它们可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2011-04-01
  • 2012-06-13
  • 2011-08-04
  • 1970-01-01
  • 2020-04-03
  • 2020-03-25
  • 2013-07-19
  • 2020-05-31
相关资源
最近更新 更多