C ++ - 仅声明具有非连续索引值的数组

时间:2016-07-22 05:44:27

标签: c++ arrays

我如何组合

string test[8];
test[3] = "Bar";
test[7] = "Foo";

单一声明?
也许类似于string test[8] = {3: "Bar", 7: "Foo"};

3 个答案:

答案 0 :(得分:4)

你是std::array的粉丝吗?然后你可以做这样的事情:

#include <array>
#include <initializer_list>
#include <iostream>
#include <string>

template<typename T, unsigned n>
std::array<T, n> sparse_array(std::initializer_list<std::pair<unsigned, T>> inits)
{
    std::array<T, n> result;
    for (auto&& p : inits)
    {
        result[p.first] = std::move(p.second);
    }
    return result;
}

int main()
{
    auto test = sparse_array<std::string, 8>({
        {3, "Bar"},
        {7, "Foo"}
    });
    std::cout << test[7] << test[3] << '\n';
}

虽然我并不认为额外的复杂性是值得的。

答案 1 :(得分:1)

你不能。如果你想专门使用一个数组,你只需要声明一个比你需要的更大的数组。您可以手动分配更多数据,但您可能需要其他一些数据结构。

string test[8];
test[3] = "Bar";
test[7] = "Foo";

你也可以做一张地图:

#include <iostream>
#include <map>
using namespace std;
int main(int argc, char *argv[]) {

    map<int,string> aMap;
    aMap[3] = "Bar";
    aMap[7] = "Foo";


}

编辑: 这是地图参考http://www.cplusplus.com/reference/map/map/

答案 2 :(得分:0)

你要做的事情是如此危险。想象一下你想要的东西:

string test[];//this is not valid the
test[3] = "Bar";
test[99999] = "Foo";

由于数组是结果数据,它会在内存中分配(99999 + 1)项,这绝对不是正确的方法。

您可以使用map:

std::map<std::size_t,std::string> test;
test[3] = "Bar";
test[7] = "Foo";

在这种情况下,内存中只分配了两个pair项。

如果您需要静态分配,可以使用:

std::array<std::pair<std::size_t,string>,2> test={{3,"Bar"},{7,"Foo"}};

请参阅@fredoverflow解决方案,它可以很好地处理您的数组。