【问题标题】:Set all values of an existing array to "magic numbers"将现有数组的所有值设置为“幻数”
【发布时间】:2015-10-31 02:47:30
【问题描述】:

所以我知道我可以在构造时将数组的每个值设置为“幻数”(在本例中为幻字符串);

string * myArray[] = {"foo", "bar", "baz"};

如果我可以声明我的数组,这将是有用的;

string * myArray[100];

然后(在 if 语句中)设置它的值;

myArray = {"foo", "bar", "baz"};

(实际的数组将包含大约 30 个魔术字符串,所以我不想一次全部分配一个)

我知道幻数(或幻数)不好。然而,我正在使用的系统是 CERN 的根,它充满了有趣的怪癖,我宁愿不再浪费时间寻找更简洁的方法。所以为了不让perfect become the enemy of the good 我会使用幻数。

这里最快的选择是什么?

编辑;接受的答案适用于 c++11。如果像我一样,你没有那个选项,这里有一个非常讨厌但实用的解决方案。 (有感性的程序员请遮住眼睛。)

int numElements;
vector<char *> myArray;
if(someCondition){
  numElements = 3;
  string * tempArray[] = {"foo", "bar", "baz"}]
  for(int n = 0; n < numElements; n++){
    const char * element = (tempArray[n]);
    myArray.push_back(element);
  }
}else if(anoutherCondition){
//More stuff
}

【问题讨论】:

  • 为什么不使用向量
  • 为什么指向字符串
  • 可以,但这有帮助吗?我想我们仍然不能像={"foo", "bar", "baz"} 那样设置?
  • 那不编译你的意思是std::string myArray[] = {"foo", "bar", "baz"};
  • 如果需要静态数组,请使用std::array,如果需要动态数组,请使用std::vector。 C++ 中的原始数组不再有用了。

标签: c++ arrays magic-numbers


【解决方案1】:

我认为您可能是指std::string 的数组,而不是std::string* 的数组,如下所示:

std::string myArray[] = {"foo", "bar", "baz"};

我这样做的方法是允许std::vector 为我管理阵列。这让我以后可以轻松地复制、移动或交换新值:

std::vector<std::string> myVector = {"foo", "bar", "baz"};

myVector = {"wdd", "ghh", "yhh"};

【讨论】:

    【解决方案2】:

    虽然内置数组不允许聚合赋值,但std::vector 允许您这样做:

    vector<string> data;
    if (someCondition) {
        data = {"quick", "brown", "fox"};
    } else {
        data = {"jumps", "over", "the", "lazy", "dog"};
    }
    

    Demo.

    这种方法有几个优点:

    • 语法简洁直观
    • 允许分配的聚合具有不同的长度
    • 分配给std::vector 的资源会自动释放。

    【讨论】:

    • 我收到了一个错误 - 虽然它很长,所以它在问题的底部。
    • @Jekowl 您需要编译为(至少)C++11。
    • @Jekowl 此语法在 C++11 和 C++14 中可用,因此您可能需要在编译器中打开一个特殊标志(假设您的编译器支持 C++11 或更高版本)。
    • @zenith 啊,那可能是不可能的。我将把这个问题留待更长时间,看看是否有任何替代方案被提出,然后为了未来读者的利益而接受这个答案。
    • 你可以使用三元(?:)运算符将赋值替换为构造吗?
    猜你喜欢
    • 2014-01-19
    • 1970-01-01
    • 2011-03-22
    • 2018-03-11
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    相关资源
    最近更新 更多