基本上它应该列出这种格式的所有矢量坐标:
(x,y,z)
但目前确实如此(x,y,z,)
最简单的方法是在for循环中使用if,但是我可以从out变量中减去一小段字符串吗?
我的代码:
template <unsigned short m>
std::ostream& operator<<(std::ostream& out, const Vector<m>& v) {
out << "(";
for(int i = 0; i < m; i++) {
out << v.coords[i] << ", ";
}
out << ")";
return out;
}
答案 0 :(得分:15)
这来自我的旧代码库。在好的方面:它带有单元测试:
更新为现代,更通用和自包含 Live On Coliru
/*! note: delimiter cannot contain NUL characters
*/
template <typename Range, typename Value = typename Range::value_type>
std::string Join(Range const& elements, const char *const delimiter) {
std::ostringstream os;
auto b = begin(elements), e = end(elements);
if (b != e) {
std::copy(b, prev(e), std::ostream_iterator<Value>(os, delimiter));
b = prev(e);
}
if (b != e) {
os << *b;
}
return os.str();
}
/*! note: imput is assumed to not contain NUL characters
*/
template <typename Input, typename Output, typename Value = typename Output::value_type>
void Split(char delimiter, Output &output, Input const& input) {
using namespace std;
for (auto cur = begin(input), beg = cur; ; ++cur) {
if (cur == end(input) || *cur == delimiter || !*cur) {
output.insert(output.end(), Value(beg, cur));
if (cur == end(input) || !*cur)
break;
else
beg = next(cur);
}
}
}
以及一些相应的单元测试用例:
void testSplit() {
std::vector<std::string> res;
const std::string test = "a test ,string, to,,,be, split,\"up,up\",";
TextUtils::Split(',', res, test);
UT_EQUAL(10u, res.size());
UT_EQUAL("a test ", res[0]);
UT_EQUAL("string", res[1]);
UT_EQUAL(" to", res[2]);
UT_EQUAL("", res[3]);
UT_EQUAL("", res[4]);
UT_EQUAL("be", res[5]);
UT_EQUAL(" split", res[6]);
UT_EQUAL("\"up", res[7]); // Thus making 'split' unusable for parsing
UT_EQUAL("up\"", res[8]); // csv files...
UT_EQUAL("", res[9]);
TextUtils::Split('.', res, "dossier_id");
UT_EQUAL(11u, res.size());
res.clear();
UT_EQUAL(0u, res.size());
TextUtils::Split('.', res, "dossier_id");
UT_EQUAL(1u, res.size());
std::string UseName = res[res.size() - 1];
UT_EQUAL("dossier_id", UseName);
}
void testJoin() {
std::string elements[] = { "aap", "noot", "mies" };
typedef std::vector<std::string> strings;
UT_EQUAL("" , TextUtils::Join(strings(), ""));
UT_EQUAL("" , TextUtils::Join(strings(), "bla"));
UT_EQUAL("aap" , TextUtils::Join(strings(elements, elements + 1), ""));
UT_EQUAL("aap" , TextUtils::Join(strings(elements, elements + 1), "#"));
UT_EQUAL("aap" , TextUtils::Join(strings(elements, elements + 1), "##"));
UT_EQUAL("aapnoot" , TextUtils::Join(strings(elements, elements + 2), ""));
UT_EQUAL("aap#noot" , TextUtils::Join(strings(elements, elements + 2), "#"));
UT_EQUAL("aap##noot" , TextUtils::Join(strings(elements, elements + 2), "##"));
UT_EQUAL("aapnootmies" , TextUtils::Join(strings(elements, elements + 3), ""));
UT_EQUAL("aap#noot#mies" , TextUtils::Join(strings(elements, elements + 3), "#"));
UT_EQUAL("aap##noot##mies", TextUtils::Join(strings(elements, elements + 3), "##"));
UT_EQUAL("aap noot mies", TextUtils::Join(strings(elements, elements + 3), " "));
UT_EQUAL("aapnootmies" , TextUtils::Join(strings(elements, elements + 3), "\0"));
UT_EQUAL("aapnootmies" , TextUtils::Join(strings(elements, elements + 3), std::string("\0" , 1).c_str()));
UT_EQUAL("aapnootmies" , TextUtils::Join(strings(elements, elements + 3), std::string("\0+", 2).c_str()));
UT_EQUAL("aap+noot+mies" , TextUtils::Join(strings(elements, elements + 3), std::string("+\0", 2).c_str()));
}
答案 1 :(得分:4)
使用if语句添加逗号
for(int i = 0;i<m;i++)
{
out<<V.coords[i];
if(i !=m-1)
out<<",";
}
答案 2 :(得分:3)
这是不可能的。另一种可能性:从循环中移出第一个或最后一个坐标的输出。然后在循环中不需要if
(或运算符?:
),但处理空向量更复杂,因为在循环外需要if。
答案 3 :(得分:2)
从i循环到m-1打印值和逗号,然后在循环结束时(打印出“)”),打印出最后一个没有逗号的元素
答案 4 :(得分:0)
这个怎么样?
InexactError
如果没有条件,您将一无所获,但是使用字符串重新分配的代价很小。