实例化字符串的问题

时间:2015-02-13 13:11:41

标签: c++ arrays string c++11

我遇到了实例化字符串并将数组传递给另一个函数的问题。昨天,我有以下代码,它工作正常:

string sources[8][3] = {
    {"ab", "cd","ef"},
    {"gh", "ij","kl"},
            (...)
}

我想将 sources 数组作为参数传递给另一个必须具有以下原型的函数:

size_t parse_data(char *ptr, size_t size, size_t nmemb, char *userdata){

因此变量将是userdata,我将转换为字符串数组的数组。我决定使用指针,但我不能做得更好:

string** sources;
sources = new string*[8];
sources[0] = new string[3];
sources[0][0] = new string("ab");

有更优雅的方式吗? 感谢

2 个答案:

答案 0 :(得分:4)

我不确定你为什么要按照自己的方式去做。但是,由于您列出了C++11,因此可以使用以下内容实例化静态array

#include <array>
...
array<array<string, 3>, 8> sources;

这一切都在堆栈上,因此无需动态分配字符串。

可以使用sources[0][0] = string("foo");

填充条目

您可以使用initializer_list一次填充所有内容:

 array<array<string, 3>, 8> sources { "ab", "cd","ef", "gh", "ij","kl",
                                      (...)};

当将c样式字符串指针传递给c_str()时,您可以在数组项上调用parse_data

例如:sources[0][0].c_str()


完整示例代码:

#include <array>
#include <iostream>

using namespace std;
int main(int, char **)
{
  array<array<string, 2>, 3> sources { "ab", "cd", "ef", "gh", "ij", "kl"};

  for (size_t i = 0 ; i < sources.size() ; ++i) {
    for (size_t j = 0 ; j < sources[0].size() ; ++j) {
      std::cout << i << "," << j << ": " << sources[i][j] << std::endl;
    }
  }

  return 0;
}

<强>输出:

0,0: ab
0,1: cd
1,0: ef
1,1: gh
2,0: ij
2,1: kl

答案 1 :(得分:1)

swalog 的上一个答案中获取,您也可以这样做

std::array<std::array<std::string, 3U>, 8U> strings
{{
    {{"ab", "cd", "ef"}},
    {{"gh", "ij", "kl"}}
}};

为了完全模仿原始(非常简洁)的语法。

为什么你会问双支撑? std::array基本上是一个数组包装器,因此第一个大括号显示“初始化std::array结构”,第二个大括号显示“使用这些值初始化内部数组”。然后你有std::array std::arrays所以你需要将这个逻辑乘以2 ...

这个想法的缺点是自动格式化IDE不太喜欢这个,但除非你制作一些大量的维度,否则你应该没问题。

修改
为了将这些值作为char*传递,您需要重新解释强制转换指向数组的指针:

char* userData = reinterpret_cast<char*>(&strings);  

然后重新解释回std::array<std::array<...>>*

auto array = *reinterpret_cast<std::array<std::array<std::string, 3U>, 8U>*>(userData);

然后,显然,如果调用者在使用数据之前返回(例如,调用不同线程中的函数来使用数据),则需要在堆上分配所有数据,但我想这已足够另一个问题线程......