Arrays 初始化GoLang和Rust中字符串数组的数组

Arrays 初始化GoLang和Rust中字符串数组的数组,arrays,go,rust,Arrays,Go,Rust,我想初始化一个2D数组,其中内部数组的每个成员都有一个1000 x的字符串。比如: var data = [num_rows][num_cols]string("x....x(upto 1000)") 但所有谷歌搜索都是徒劳的。在C++中,我可以实现类似的事情: vector<vector<string>> data(num_rows, vector<string>(num_cols, string("x",1000))); 想要在go中获得类似的结果,但

我想初始化一个2D数组,其中内部数组的每个成员都有一个1000 x的字符串。比如:

var data = [num_rows][num_cols]string("x....x(upto 1000)")
但所有谷歌搜索都是徒劳的。在C++中,我可以实现类似的事情:

vector<vector<string>> data(num_rows, vector<string>(num_cols, string("x",1000)));
想要在go中获得类似的结果,但我找不到任何文档来填充字符串和初始化2D数组。还要注意,我希望为数组的每个成员生成字符串,而不是使用可用的字符串


附言:我也在寻找类似铁锈的东西

你可以用切片。这可能不是最短的解决方案,但对我来说很有效

package main

import (
    "fmt"
    "strings"
)

func main() {
    xs := strings.Repeat("x", 1000)

    num_rows := 5
    num_cols := 5

    data := make([][]string, num_rows)
    for y := 0; y < num_rows; y++ {
        data[y] = make([]string, num_cols)
        for x := 0; x < num_cols; x++ {
            data[y][x] = xs
        }
    }

    fmt.Printf("%T", data)
    fmt.Print(data)
}
主程序包
进口(
“fmt”
“字符串”
)
func main(){
xs:=字符串。重复(“x”,1000)
行数:=5
num_cols:=5
数据:=生成([]字符串,行数)
对于y:=0;y
在Rust中,这取决于您希望将这些值用于什么。我喜欢创建重复的字符串。“行”取决于您是否需要引用或复制语义,这在rust中是显式的。
借用
向量是一组借用的字符串,它们引用了
x_s
所拥有的内存。
copies
向量是原始
xus
字符串的一组内存副本

use std::iter;

fn main() {
    let num_rows = 1000;
    let num_cols = 1000; 

    let x_s : String = iter::repeat('x').take(num_cols).collect();

    // pick one of the below
    let borrows : Vec<&str> = vec![&*x_s ; num_rows];
    let copies : Vec<String> = vec![x_s.clone() ; num_rows];
}
使用std::iter;
fn main(){
设num_rows=1000;
设num_cols=1000;
让x_s:String=iter::repeat('x').take(num_cols.collect();
//从下面的选项中选择一个
让我们借用:Vec=Vec![&*x_s;num_rows];
让我们复制:Vec=Vec![x_s.clone();num_rows];
}
最后一行中对
clone
的调用是因为
vec
宏移动发送到其中的值。如果是
复制
,则
vec
宏还将克隆此克隆
num_行
次。请注意,这种
克隆在大多数用例中可能不是必需的,因为您通常不会在同一范围内同时进行
借用
复制


作为一个警告,我是一个相当新的生锈,但相信这是一个体面的答案。我很高兴接受更正。

一个非常简单的rust在线示例:

fn main() {
    let data: Vec<String> = (0..1000).map(|n| (0..n).map(|_| 'x').collect()).collect();
    println!("{:?}", data);
}
fn main(){
让数据:Vec=(0..1000).map(|n |(0..n).map(| | x').collect()).collect();
println!(“{:?}”,数据);
}

a:=[]字符串{'xxx',xxx',xxx'}
?@u\u mulder所以这是一个由3个“xxx”组成的数组。假设我想将它初始化为1000“x…这里是1000x”。如何实现C++的字符串构造函数?代码>字符串。重复(“x”,1000)< /C>?@ uuMuldHeaveMe!关于如何用这个字符串初始化一个切片或1000个元素的数组(我的意思是是否有一个库函数,或者我是否必须自己使用迭代?)如果Go和Rust问题是分开的,那么会更清楚。事实上,你将如何接受一个最好的答案?请将此问题一分为二并交叉引用。无论元素类型是
&str
还是
字符串
,您都可以使用
Vec来构造Vec![elem;n]
。我同意可以将
借用
转换为此语法,但由于调用了clone,我不认为
复制
可以转换为此语法。
vec![x;n]
呼叫
克隆
:感谢您的建议,我更新了帖子以反映这些建议。这个看起来怎么样?我想现在更规范了?对于副本,只需
vec![x_s;num_rows]
就足够了。否则看起来不错@问题中的icza:“PS:我也在寻找类似的锈迹”——不可否认,这不是一个好的提问风格。@delnan我认为这会被标记为重复。否?@sky_coder123:否;不同的语言做事情的方式不同,所以问题因问不同的情况而不同。@MatthieuM。实际上,我正在尝试评估一些操作中各种语言的性能,所以我认为它们是相关的。我同意有不同的方式来做不同的事情(就像露比和C++提供的问题),但我的目的不是问一个特定的语言。@ SkysCoDe123:你看过吗?粗略地说,C/C++/Rust处于相同的范围内,Go稍微慢一点(在Java范围内,一般不超过x1.5/x2),Ruby当然慢得多(x10/x50)。当然,您应该对微基准测试持保留态度,特别是当解释语言将大部分计算委托给C库时……非常接近。没有一艘班轮吗?
fn main() {
    let data: Vec<String> = (0..1000).map(|n| (0..n).map(|_| 'x').collect()).collect();
    println!("{:?}", data);
}