如何将整数字符串转换为二维整数向量?
How to convert the string of integer to 2D vector of integers?
鉴于我想要的输出是方形输出(它们之间不需要任何空格):
1234
2345
3456
4567
给定相同的数字平方,但每个数字都是 std::string
,我如何实现 2D 向量 需要 正方形的每个字符 并首先将每个字符转换为 int
然后存储到行和列 的 二维向量中以生成完全相同的正方形?
我知道二维向量需要
vector<vector<int>> square_vector;
但是我在获取所有成对的行和列时遇到了问题。
编辑:
如果我的方块是
1234
2345
3456
4567
我想先浏览第一行 1234
。然后在该行中,我想遍历每个列字符 1, 2, 3, 4
并将每个字符转换为 int
。转换后,我想将 push_back
作为一行放入 2D 向量中。完成一行后,我想转到下一行并执行相同的任务。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> square_vector;
int n,a;
// taking input the number of strings
cin>>n;
char s[100];
vector<int> i;
while(n--)
{
// take input string one by one
cin>>s;
a=0;
//push character by character of that string into vector
while(s[a]!='[=10=]')
{
i.push_back(s[a]-'0');
a++;
}
// push that vector into 2D vector
square_vector.push_back(i);
i.clear();
}
int j;
//printing your 2D vector
for(a=0;a<square_vector.size();a++)
{
i=square_vector.at(a);
for(j=0;j<i.size();j++)
cout<<i.at(j);
cout<<"\n";
}
return 0;
}
虽然你应该自己试过,但我在这里为你做了。
But I was having trouble taking all of the paired rows and column.
既然您正在使用 std::vector
,为什么不直接使用 range based for loop 来完成这项工作。希望评论能帮助您完成代码。
#include <iostream>
#include <vector>
#include <string>
int main()
{
// vector of strings to be converted
std::vector<std::string> strVec{ "1234", "2345", "3456", "4567" };
// get the squre size
const std::size_t size = strVec[0].size();
// resulting 2D vector
std::vector<std::vector<int>> result; result.reserve(size);
for (const std::string& strInteger : strVec)
{
std::vector<int> rawVec; rawVec.reserve(size);
for (const char Char : strInteger)
// if (std::isdigit(Char)) //(optional check)
rawVec.emplace_back(static_cast<int>(Char - '0'));
// save the row to the 2D vector
result.emplace_back(rawVec);
}
// print them
for (const std::vector<int>& eachRaw : result)
{
for (const int Integer : eachRaw)
std::cout << Integer << " ";
std::cout << std::endl;
}
}
输出:
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
Given the same square of numbers, but each one of them being a string
其中有些含糊不清。接受的答案将正方形视为
std::vector<std::string>
但也可以理解为
std::vector<std::vector<std::string>>
此版本同时处理:
#include <iostream>
#include <string>
#include <vector>
template<typename T>
int toint(const T& x) {
return std::stoi(x);
}
template<>
int toint(const char& x) {
return x-'0';
}
template<class T>
std::vector<int> line2intvec(const T& in) {
std::vector<int> result;
for(auto& e : in) {
result.push_back( toint(e) );
}
return result;
}
void print_vvi(const std::vector<std::vector<int>>& vvi) {
for(auto& l : vvi) {
for(auto& r : l) {
std::cout << " " << r;
}
std::cout << "\n";
}
}
int main() {
std::vector<std::string> vs = {
"1234",
"2345",
"3456",
"4567"
};
std::vector<std::vector<std::string>> vvs = {
{ "1", "2", "3", "4" },
{ "2", "3", "4", "5" },
{ "3", "4", "5", "6" },
{ "4", "5", "6", "7" }
};
std::vector<std::vector<int>> result1;
std::vector<std::vector<int>> result2;
for(auto& s : vs) {
result1.emplace_back( line2intvec(s) );
}
print_vvi(result1);
for(auto& v : vvs) {
result2.emplace_back( line2intvec(v) );
}
print_vvi(result2);
}
鉴于我想要的输出是方形输出(它们之间不需要任何空格):
1234
2345
3456
4567
给定相同的数字平方,但每个数字都是 std::string
,我如何实现 2D 向量 需要 正方形的每个字符 并首先将每个字符转换为 int
然后存储到行和列 的 二维向量中以生成完全相同的正方形?
我知道二维向量需要
vector<vector<int>> square_vector;
但是我在获取所有成对的行和列时遇到了问题。
编辑: 如果我的方块是
1234
2345
3456
4567
我想先浏览第一行 1234
。然后在该行中,我想遍历每个列字符 1, 2, 3, 4
并将每个字符转换为 int
。转换后,我想将 push_back
作为一行放入 2D 向量中。完成一行后,我想转到下一行并执行相同的任务。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> square_vector;
int n,a;
// taking input the number of strings
cin>>n;
char s[100];
vector<int> i;
while(n--)
{
// take input string one by one
cin>>s;
a=0;
//push character by character of that string into vector
while(s[a]!='[=10=]')
{
i.push_back(s[a]-'0');
a++;
}
// push that vector into 2D vector
square_vector.push_back(i);
i.clear();
}
int j;
//printing your 2D vector
for(a=0;a<square_vector.size();a++)
{
i=square_vector.at(a);
for(j=0;j<i.size();j++)
cout<<i.at(j);
cout<<"\n";
}
return 0;
}
虽然你应该自己试过,但我在这里为你做了。
But I was having trouble taking all of the paired rows and column.
既然您正在使用 std::vector
,为什么不直接使用 range based for loop 来完成这项工作。希望评论能帮助您完成代码。
#include <iostream>
#include <vector>
#include <string>
int main()
{
// vector of strings to be converted
std::vector<std::string> strVec{ "1234", "2345", "3456", "4567" };
// get the squre size
const std::size_t size = strVec[0].size();
// resulting 2D vector
std::vector<std::vector<int>> result; result.reserve(size);
for (const std::string& strInteger : strVec)
{
std::vector<int> rawVec; rawVec.reserve(size);
for (const char Char : strInteger)
// if (std::isdigit(Char)) //(optional check)
rawVec.emplace_back(static_cast<int>(Char - '0'));
// save the row to the 2D vector
result.emplace_back(rawVec);
}
// print them
for (const std::vector<int>& eachRaw : result)
{
for (const int Integer : eachRaw)
std::cout << Integer << " ";
std::cout << std::endl;
}
}
输出:
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
Given the same square of numbers, but each one of them being a string
其中有些含糊不清。接受的答案将正方形视为
std::vector<std::string>
但也可以理解为
std::vector<std::vector<std::string>>
此版本同时处理:
#include <iostream>
#include <string>
#include <vector>
template<typename T>
int toint(const T& x) {
return std::stoi(x);
}
template<>
int toint(const char& x) {
return x-'0';
}
template<class T>
std::vector<int> line2intvec(const T& in) {
std::vector<int> result;
for(auto& e : in) {
result.push_back( toint(e) );
}
return result;
}
void print_vvi(const std::vector<std::vector<int>>& vvi) {
for(auto& l : vvi) {
for(auto& r : l) {
std::cout << " " << r;
}
std::cout << "\n";
}
}
int main() {
std::vector<std::string> vs = {
"1234",
"2345",
"3456",
"4567"
};
std::vector<std::vector<std::string>> vvs = {
{ "1", "2", "3", "4" },
{ "2", "3", "4", "5" },
{ "3", "4", "5", "6" },
{ "4", "5", "6", "7" }
};
std::vector<std::vector<int>> result1;
std::vector<std::vector<int>> result2;
for(auto& s : vs) {
result1.emplace_back( line2intvec(s) );
}
print_vvi(result1);
for(auto& v : vvs) {
result2.emplace_back( line2intvec(v) );
}
print_vvi(result2);
}