如何将2D数组打印为矢量?

时间:2015-09-14 00:57:06

标签: c++ arrays vector c++03

所以我试图将句子存储在一个数组中,然后将它们传递给一个向量,然后打印到屏幕上,如:

void opt(char **desc)
{
      std::vector <std::string> desc_v(desc, desc + sizeof(desc)/sizeof(desc[0]));

      for (int i=0; i<desc_v.size(); ++i){
            std::cout<< desc_v[i]<<'\n';
      }
}

int main(int argc, char **argv){
    static char *desc[] = {
    "This is an entire sentence",
    "And i want to keep printing the rest of the sentences"
    };

    opt(desc);
    return 0;
    }

但它只打印:

  

这是一整句

有什么帮助吗? 注意:请不要使用c ++ 11。

2 个答案:

答案 0 :(得分:1)

您需要让opt函数知道数组中有多少个字符串。一种简单的方法是将数组大小作为模板参数,并通过引用传递数组。以下是使用std::array的解决方案:

#include <iostream>
#include <string>
#include <array>
#include <vector>

template<size_t N>
void opt(std::array<std::string, N> &desc)
{
    std::vector <std::string> desc_v( std::begin(desc), std::end(desc) );

    for ( auto&& s : desc_v )    // or just desc
        std::cout << s << '\n';
}

int main()
{
    std::array<std::string, 2> desc = {
        "This is an entire sentence",
        "And i want to keep printing the rest of the sentences"
    };

    opt(desc);
    return 0;
}

当然,desc_v是多余的,您可以刚刚打印desc

或者,该功能可以是:

template<size_t N>
void opt(char const * const (&desc)[N])

使用相同的正文,并将desc声明为:

char const *const desc[] = {

您的现有代码自C ++ 11以来是非法的(之前已弃用);非const char *可能无法指向字符串文字。

答案 1 :(得分:1)

我有一个疯狂的时间在脑海里解决这里发生的事情。

  std::vector <std::string> desc_v(desc, desc + sizeof(desc)/sizeof(desc[0]));

您正在调用vector desc_v的构造函数,它接受两个迭代器并在它们之间存储值。它从第一个迭代器开始,在最后一个迭代器之前结束。

sizeof(desc)/sizeof(desc[0]) //Does not do what you intended

当你sizeof(desc)时,你的大小是char**,而不是数组。 sizeof(desc[0])的大小为char*,因为char**取消引用一次的类型为char*。我不知道这是否有保证,但至少在这种情况下char**char*大小相同,评估为1

std::vector <std::string> desc_v(desc, desc + 1); //It turns into this

descdesc + 1的范围(包括第一个元素,但不包括最后一个元素)恰好是desc。将其作为迭代器处理,desc_v取消引用desc并存储该值。该值是desc顶层的第一个元素,它是第一个字符串文字的地址。

这就是为什么它只打印一个句子。要打印所有内容,我认为最接近你所拥有的就是使用像M.M建议的std::array

或者,让opt取一个计数参数。

void opt(char **desc, int count)
{
    std::vector <std::string> desc_v(desc, desc + count);
    /* same */
}

//calling opt
opt(desc, 2);

或者如果你真的想......

opt(desc, sizeof(desc) / sizeof(desc[0]));