在一个语句中分配数组的多个元素(初始化后)

Assigning multiple elements of array in one statement(after initialization)

提问人:lorem1213 提问时间:7/16/2022 最后编辑:Vlad from Moscowlorem1213 更新时间:7/16/2022 访问量:502

问:

    std::string mstring[5];
        mstring[0] = "veena";
        mstring[1] = "guitar";
        mstring[2] = "sitar";
        mstring[3] = "sarod";
        mstring[4] = "mandolin";

我想像上面一样分配数组。我不想在初始化时这样做,而是稍后分配。有没有办法将 5 个语句合二为一。

C++ 数组赋 值运算符

评论

0赞 user12002570 7/16/2022
Dupe:是否可以(重新)在一行中设置数组的所有值(初始化后)?
2赞 Passer By 7/16/2022
@AnoopRana C++没有数组文字,那里的答案肯定不适用。
1赞 PaulMcKenzie 7/16/2022
@lorem1213 我不想在初始化时这样做,而是稍后分配。 -- 一个问题 -- 你为什么不把你的变量声明在你实际使用它们的地方?声明数组离其实际使用点如此之远的原因是什么?C++ 给你的一个优点是,你可以在使用点声明变量,而不是在块的顶部。C{ }
1赞 Peter 7/16/2022
要回答所提出的问题,不,没有办法。原始数组(与具有不同功能的C++不同)不能在单个语句中赋值(除非通过在一个语句中执行多个赋值的技术,例如用逗号运算符分隔,但这显然不是这里所寻求的)。仍然存在一个有效的问题,即为什么要这样做,因为在C++中,在初始化之前完全没有必要定义任何变量(或数组)。std:array
1赞 PaulMcKenzie 7/16/2022
@lorem1213 -- 以这种方式组织的代码使你的问题变得毫无意义。还建议的 C++ 编码样式是在靠近变量使用位置的地方声明变量。{ ...some code...; std::string mystring[] = {"a","b","c","d","e"}; ...code using mystring...}

答:

-1赞 MikeCAT 7/16/2022 #1

您可以使用逗号运算符将多个表达式合并为一个语句。

mstring[0] = "veena",
mstring[1] = "guitar",
mstring[2] = "sitar",
mstring[3] = "sarod",
mstring[4] = "mandolin";

评论

0赞 BoP 7/16/2022
+1 最佳滥用规则。现在它是一个语句,根据需要,(但不幸的是仍然是 5 行)。
0赞 MikeCAT 7/16/2022
@BoP 删除换行符以使其成为单行。
1赞 Vlad from Moscow 7/16/2022 #2

您可以通过使用代替原始数组来做到这一点。std::array<std::string, 5>

例如

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

int main()
{
    std::array<std::string, 5> mstring;
    
    mstring = { "veena", "guitar", "sitar", "sarod", "mandolin" };

    for ( const auto &s : mstring )
    {
        std::cout << s << ' ';
    }
    std::cout << '\n';
}

程序输出为

veena guitar sitar sarod mandolin 

使用原始数组的另一种方法是在基于范围的 for 循环中使用。例如std::initializer_list

#include <iostream>
#include <string>

int main()
{
    std::string mstring[5];
    
    size_t i = 0;

    for ( auto s : { "veena", "guitar", "sitar", "sarod", "mandolin" } )
    {
        mstring[i++] = s;
    }

    for ( const auto &s : mstring )
    {
        std::cout << s << ' ';
    }
    std::cout << '\n';
}

程序输出同上

veena guitar sitar sarod mandolin 

如果您的编译器支持 C++ 20,则不要使用这些语句

size_t i = 0;

for ( auto s : { "veena", "guitar", "sitar", "sarod", "mandolin" } )
{
    mstring[i++] = s;
}

您只能使用一个基于范围的 for 循环

for ( size_t i = 0; auto s : { "veena", "guitar", "sitar", "sarod", "mandolin" } )
{
    mstring[i++] = s;
}

评论

2赞 Vlad from Moscow 7/16/2022
@AnoopRana OP 甚至不知道 std::array。所以这些信息对他很有用。
1赞 user12002570 7/16/2022
如果是这样,您可以编辑重复列表,而不是重新打开问题。有很多重复的,涵盖了如何评估 std::array 或如何使用 std::array 以及它们相对于内置数组的优势。
0赞 Vlad from Moscow 7/16/2022
@AnoopRana 找到重复项对我来说并不有趣。
1赞 Vlad from Moscow 7/16/2022
@AnoopRana这是我第一次回答这样的问题。如果我要搜索重复项,我会忘记C++我自己:)我需要练习:)
1赞 Vlad from Moscow 7/16/2022
@AnoopRana 他是一个初学者。你应该考虑到这一点。此外,我还展示了如何使用原始数组来完成它。这在 C 语言中是无法完成的。你应该对初学者的问题投赞成票。
1赞 RawkFist 7/16/2022 #3

这是一个双行,但我认为单行对于本机阵列是不可能的(至少据我所知)。

  1. 使用所需值初始化临时数组
  2. 使用原始数组交换指针

这样,您可以对数组使用单行初始化,但仍然可以在设置值之前操作原始数组。

#include <string>
#include <iostream>

int main(){
    
  std::string mystring[5];
  std::string tmp[5] = {"veena","guitar","sitar", "sarod", "mandolin"};
  std::swap(mystring, tmp);
  for(auto& s : mystring) std::cout << s << std::endl;
  return 0;
}